使用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< 1000.
从外部查询中删除已连接的TransactionHistory表可以解决问题,但我只想知道原始查询返回我看到的行的原因。
由于
编辑:
为了澄清,我理解如何解决我想要的问题。我只是想了解EXISTS的行为,以及为什么我没有得到我期望的结果。
以下子查询(它是EXISTS子查询的一部分)只返回一个结果。
select *
from Production.TransactionHistory t
where t.Quantity = 1000
因此,如果这是在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的每一行匹配CURRENT外行的id,订单数量为1000"。但这不是它的表现。只是想了解原因。
答案 0 :(得分:2)
您的查询听起来像这样:
获取产品的所有交易历史记录条目(如果有任何历史记录条目) 数量等于1000。
EXISTS
返回true或false,所以
EXISTS(
select *
from Production.TransactionHistory t
where t.Quantity = 1000
and t.ProductID=p.ProductID
)
将对具有Transaction with Quantity = 1000
的产品的所有TransactionHistory行返回true另外:
上面的查询将针对" Main"的每一行执行。查询并在您的案例中的每一行返回True
。这就是为什么你得到所有行
答案 1 :(得分:0)
EXISTS
返回true。
您正在寻找类似下面的查询:
SELECT p.color, p.productid, p.name, th.Quantity
FROM production.product p, production.TransactionHistory th
WHERE p.ProductID = th.ProductID and th.Quantity = 1000
或者您可以将其替换为更好看的join
查询,如下所示:
SELECT p.color, p.productid, p.name, th.Quantity
FROM production.product p
INNER JOIN production.TransactionHistory th ON p.ProductID = th.ProductID
WHERE th.Quantity = 1000
答案 2 :(得分:0)
这是因为您只检查EXIST子句中的ProductID。当它使用您的productID找到至少一个事务时,它会显示此类事务。因此,将显示具有数量等于1000的交易的产品的所有交易。
答案 3 :(得分:0)
基本上你的查询是
向我提供所有产品及其交易历史记录 EVER 数量为1000的交易