2013-10-09 32 views
2
  • 有一張表Productsp_nop_desc
  • 有一個表order_detailsp_no(同上)。

我需要p_desc其中products.p_no不在order_details獲取不是訂單中的產品描述

注:我做了很多搜索,這就是我想出的結果。

-- Why would this work? 
select p_desc from products 
except 
select p_no from order_details 

-- Then, 
select p_desc from products 
where products.p_no not in order_details.p_no 

-- and finally, 
select p_desc from products 
where (p_no not in (select p_no from order_details)) 

這些都是正確的嗎?我被告知要使用except,但我不明白第一個聲明如何比較p_no屬性,所以我假設這是錯誤的。

+0

http://technet.microsoft.com/en-us/library/ms188055.aspx – Johan

+0

來自任何來源(包括作業)的問題都歡迎Stack Overflow,只要它們滿足所有問題的標準(清晰,簡潔,代碼重現問題,嘗試解決方案和研究等)。沒必要提及它的作業,實際上,儘量不要將它作爲一個偉大的編程問題(對其他沒有你的具體任務的人也有用)來自己去確定問題它符合提到的標準。 – Jeroen

回答

0

最簡潔的方法是使用NOT EXISTS。我剛纔已經回答了類似的問題在這裏:

https://dba.stackexchange.com/questions/51270/get-unmatched-rows-for-foreign-key

(需要注意的是這個問題的答案是MySQL,但是T-SQL的語法是一樣的)

在你的情況該查詢應該是這樣的:

SELECT p_desc FROM dbo.products AS P 
WHERE (NOT EXISTS (SELECT 1 FROM dbo.order_details AS OD WHERE OD.p_no = P.p_no)); 
+0

這不是一個答案。它應該是一個評論。 OP詢問「EXCEPT如何工作」。 – Johan

+0

非常感謝!請問第二選擇中「1」的功能是什麼? –

+0

儘管你對自己的知識有(似乎沒有根據的)信念,但遠不是「最乾淨」的解決方案,這很可能是最糟糕的。請參閱@ Johan的答案,以獲得大多數人認爲最乾淨的解決方案。 – Bohemian

1

因爲這是作業,我不打算拼出來。

//爲什麼會這樣工作?
從產品
選擇p_desc除了
從ORDER_DETAILS

選擇p_no

參見:http://technet.microsoft.com/en-us/library/ms188055.aspx
提示:以下代碼是等效的:

SELECT p.p_desc FROM products p 
LEFT JOIN order_details o ON (o.p_no = p.p_no) 
WHERE o.p_no IS NULL 

//然後,
選擇產品p_desc
其中products.p_no not in order_details.p_no

看起來像語法錯誤。

//最後,
從產品
選擇p_desc在哪裏(從ORDER_DETAILS p_no不在(選擇p_no))

看起來不錯,我覺得這是一個最容易理解的。

微軟EXCEPT
備註雖然我可以看到易用性的說法,使用這樣的代碼,這將使它很難你的代碼移植到另一個平臺。
我建議儘量靠近SQL-92的核心,並在上一條語句中使用該表單。
它會讓你成爲一個更全面的程序員,並防止鎖定到一個單一的平臺上,就職前景而言,這隻能是一件好事。

從功能的角度來看,代碼樣本A對樣本C沒有任何好處,它們都需要花費相同的時間來運行。