为什么这两个“等效”查询会返回不同数量的行?

时间:2011-11-04 14:58:40

标签: sql

也许我一直在看这个太久了 - 但有人可以帮我看看为什么这两个应该返回相同内容的查询返回不同数量的行?

select ip.* 
from invoice_payment ip
inner join invoice_item II on ii.invoice_item_uuid = ip.invoice_item_uuid
inner join service_delivery sd on sd.service_delivery_uuid = ii.service_delivery_uuid
inner join #Affected on #Affected.service_delivery_uuid = sd.service_delivery_uuid


select * 
from invoice_payment ip
where ip.invoice_item_uuid in (
  select ii.invoice_item_uuid from invoice_item ii
  where ii.service_delivery_uuid in (
    select service_delivery_uuid from #Affected)
)

谢谢!

2 个答案:

答案 0 :(得分:4)

第一个返回产品:

IP x II x sd x #Affected

然后,产品受on条件的限制。但是如果任何条件匹配多行,那么最终会有比IP表中的行更多的行。

第二个查询返回符合特定条件的IP中的行。第二个查询永远不会返回比IP中更多的行。

答案 1 :(得分:1)

如果invoice_item,service_delivery或#Affected中的任何一个表包含多个与其所加入的表对应的记录,那么这将增加结果集中的记录数,实际上乘以invoice_payment的次数据报道。

因为我觉得invoice_payment可能对应于多个invoice_item,所以这就是我首先看的地方。

顺便说一下,这两个查询甚至不等同。