2011-08-26 55 views

回答

4

做一個LEFT OUTER JOIN:這個會,對於表1中的每一行發現在表2中相應的行(S) - 但LEFT OUTER會導致它返回與空值行的表2的值時,沒有找到值。然後,只要問那些table2字段爲NULL(因此不存在)的地方。

select id from test1 
LEFT OUTER JOIN test2 
ON test1.id = test2.id 
where test2.id IS NULL 

你可以嘗試一個子查詢過,但這會不會有更好的表現(通常更糟):

SELECT id FROM test1 
WHERE id NOT IN (select id from test2) 
+2

http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ – Quassnoi

+0

@Quassnoi:這就是爲什麼我說「不好」而不是「更糟糕」;) – Konerak

+1

如果'test2.id'不爲空,那麼兩者具有相同的計劃並且性能相同(如果是,則查詢具有不同的語義) 。我想說的是,你的陳述是誤導性的(而「通常更糟」的部分是錯誤的),並提供了關於「MySQL」中的「可怕子查詢」的神話。 – Quassnoi

3
SELECT id 
FROM test1 
WHERE id NOT IN 
     (
     SELECT id 
     FROM test2 
     ) 
+0

這會起作用,但應該指出JOINs(比如@Konerak的答案)通常比嵌套查詢c.f更受歡迎。 http://stackoverflow.com/questions/3856164/sql-joins-vs-sql-subqueries-performance – 5arx

+0

@ 5arx:這是錯誤的。 http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ – Quassnoi

+0

有趣 - 你知道現在是否與SQL Server的情況?這篇文章只提到了mySQL。 – 5arx

1

你可以做一個子查詢,但你也可以使用左加入:

SELECT test1.* 
FROM test1 
LEFT JOIN test2 
ON test1.id = test2.id 
WHERE test2.id IS NULL 
相關問題