2012-11-05 87 views
1

我們的應用程序已被現在使用的這個查詢了一會兒:簡化查詢(左外連接)

SELECT id 
FROM invoice 
WHERE id NOT IN 
(SELECT invoice_id FROM invoice_transaction) 

#437 rows returned 

在代碼審查,該查詢與左外改寫加盟:

SELECT invoice.id 
FROM invoice 
LEFT OUTER JOIN invoice_transaction on invoice.id=invoice_transaction.invoice_id 

#586 rows returned 

第一個查詢返回437行,第二個(假定是相同的)查詢返回586行。這不是左外連接的有效使用嗎?

什麼是更好的方式來重寫這個查詢?

謝謝!

+2

他們不都是一樣的。瞭解[SQL連接](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html):您可以使用過濾器製作第二個等同於第一個'在哪裏invoice_transaction.invoice_id是NULL'。 – eggyal

+0

在這個位置的維恩圖似乎表明左外連接是我正在尋找的。 http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/ – rinogo

+0

啊啊,謝謝! – rinogo

回答

4

下面的查詢應返回的第一個查詢的結果相同:

SELECT invoice.id 
FROM invoice 
LEFT OUTER JOIN invoice_transaction 
      on invoice.id = invoice_transaction.invoice_id 
WHERE invoice_transaction.invoice_id IS NULL 
0

最好的辦法是這樣的

SELECT id 
FROM invoice as i 
WHERE not exists 
(SELECT invoice_id FROM invoice_transaction as it where it.invoice_id=i.id)