2014-02-24 54 views
0

我想找到一個列值出現在另一個表列值中。如何在sql server中使用NOT EXISTS

e.g

Product_Name(tb_new_purchase) 
1.car 
2.bus 
3.truck 


Product_Name(tb_new_product_Name_id) 
1.car 

,我需要選擇公共汽車和卡車

這裏是我的代碼

SELECT Product_Name 
FROM tb_new_purchase 
WHERE NOT EXISTS (SELECT Product_Name FROM tb_new_product_Name_id) 

但它不返回任何values.where我做了錯誤?感謝....

回答

0

我知道這裏已經有5個答案了......但只是爲了在這裏拋出這個問題,您可以將其作爲連接而不是存在於其中。子查詢可能會影響性能和運行時間。在MSSQL中,運行時應該大致相同...是MySQL,這種連接語法的工作效果要好得多。

Select a.product_name 
from tb_new_purchase a 
left join tb_new_product_Name_id b on a.product_name = b.product_name 
where b.product_name is null 

只要product_name不在b表中,在這裏使用左連接將在b.product_name列中產生一個空值。 product_name爲null的位置用作篩選所有在'b'表中具有條目的行。

+1

當發表類似「子查詢可能會影響性能」的語句時,您應該自己運行測試或與擁有者進行覈對。否則,你會冒傳播錯誤信息的風險。 @AaronBertrand已經運行了這樣的測試,他更喜歡'not exists'形式。請閱讀此處:http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join。 –

0

這是你所需要的:

SELECT Product_Name FROM tb_new_purchase WHERE Product_Name NOT IN(SELECT Product_Name FROM tb_new_product_Name_id)

1

或者使用NOT IN或現場傳遞到NOT EXISTS

SELECT Product_Name 
FROM tb_new_purchase 
WHERE Product_Name NOT IN(SELECT Product_Name FROM tb_new_product_Name_id) 

SELECT Product_Name 
FROM tb_new_purchase 
WHERE NOT EXISTS (SELECT Product_Name FROM tb_new_product_Name_id 
        WHERE tb_new_product_Name_id = tb_new_purchase.Product_Name ) 
+0

相同的執行計劃...... – thepirat000

+0

可以請你告訴如何觸發編寫使用插入 – Happy

0

你查詢正在檢查全部產品名稱tb_new_product_Name_id。如果表格不是空的,則它通過where子句。我想你想要一個相關的子查詢:

SELECT np.Product_Name 
FROM tb_new_purchase np 
WHERE NOT EXISTS (SELECT 1 
        FROM tb_new_product_Name_id npni 
        WHERE np.Product_Name = npni.Product_Name 
       ); 
+0

可以請你告訴如何觸發寫使用插入的 – Happy

0

您需要添加一個條件來限制子查詢。如果執行查詢

SELECT Product_Name FROM tb_new_product_Name_id 

它總是返回一些記錄,所以NOT EXISTS是錯誤的。嘗試類似於

SELECT Product_Name 
FROM tb_new_purchase 
WHERE NOT EXISTS (SELECT Product_Name 
        FROM tb_new_product_Name_id 
        WHERE tb_new_purchase.id = tb_new_product_Name_id.id) 
0

您可以使用EXCEPT達到你所需要的是這樣的:

SELECT Product_Name 
FROM tb_new_purchase 
EXCEPT 
SELECT Product_Name 
FROM tb_new_product_Name_id