【发布时间】:2016-06-03 04:21:12
【问题描述】:
使用 AdventureWorks2014 数据库,我正在试验 EXIST 关键字。请注意以下查询:
select p.color, p.productid, p.name, th.Quantity
from production.product p, production.TransactionHistory th
where p.ProductID=th.ProductID and EXISTS(
select *
from Production.TransactionHistory t
where t.Quantity = 1000
and t.ProductID=p.ProductID
)
我原本希望一次只能看到订购 1000 个的产品(只有一个交易满足此条件),但我得到了数百行 th.Quantity
从外部查询中删除连接的 TransactionHistory 表可以解决问题,但我只想知道为什么原始查询返回我看到的行。
谢谢
编辑:
为了澄清,我了解如何解决我想要的问题。我只是想了解 EXISTS 的行为以及为什么我没有得到预期的结果。
以下子查询(是 EXISTS 子查询的一部分)只返回一个结果。
select *
from Production.TransactionHistory t
where t.Quantity = 1000
因此,如果 this 在 EXISTS 中,它每次都会返回 true。需要注意的是,我在子查询中将 t.ProductID 与 p.ProductID 链接起来。因此,对于外部查询中的每一行,产品 ID 应该与内部查询中的产品 ID 匹配。 EXISTS 应该只在产品 ID 匹配并且数量正好为 1000 时返回 true。准确地说,EXIST 应该只在产品 ID 为 994 时返回 true,因为整个表中只有一个事务(具有该产品 ID)满足产品 ID 要求和 1000 个数量要求。
注意 EXISTS 子查询的其余部分...
where t.Quantity = 1000 and t.ProductID=p.ProductID
产品 ID 必须与外部记录的产品 ID 匹配,并且数量必须为 1000。
对我来说,这个查询说“给我所有产品的颜色、产品 id 和名称,加入交易,然后只包括交易表中至少有一条产品 id 与 id 匹配的记录的每一行CURRENT 外行,订单数量为 1000"。但这不是它的行为方式。只是想了解原因。
【问题讨论】:
-
为了澄清,我了解如何解决我想要的问题。我只是想了解 EXISTS 的行为以及为什么我没有得到预期的结果。
-
在一个简单的测试中,我没有得到意外的结果。你能提供样本数据吗?您的查询将所有记录从产品返回到历史连接,其中至少有一条历史记录的数量为 1000。因此,如果您看到 productid 994 的多条记录,这是有道理的,因为至少有一条数量为 1000,如果您看到的其他产品 ID 没有意义。
-
产品 ID 相同,但我得到的结果是有交易数量 1000。我通过查看查询计划弄清楚了发生了什么。本质上,子查询返回 1 行使存在为真,但由于该产品 ID 有数百个其他事务,它们在外部查询的联接中被链接。
标签: sql sql-server