【问题标题】:Simplifying a query (with left outer join)简化查询(使用左外连接)
【发布时间】:2012-11-05 23:47:51
【问题描述】:

我们的应用使用这个查询已经有一段时间了:

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 行。这不是对左外连接的有效使用吗?

重写此查询的更好方法是什么?

谢谢!

【问题讨论】:

  • 它们完全不同。了解SQL joins:您可以使用过滤器WHERE invoice_transaction.invoice_id IS NULL 使第二个等效于第一个。
  • 这个位置的维恩图似乎表明左外连接是我正在寻找的。 khankennels.com/blog/index.php/archives/2007/04/20/…
  • 现在想想,这似乎很明显。再次感谢。 :)

标签: mysql sql join query-optimization outer-join


【解决方案1】:

以下查询应返回与第一个查询相同的结果:

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

【讨论】:

    【解决方案2】:

    最好的办法是这样

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      相关资源
      最近更新 更多