2012-11-05 67 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)