使用EXIST运算符的SQL查询 - 结果

时间:2016-06-03 04:21:12

标签: sql sql-server

使用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"。但这不是它的表现。只是想了解原因。

4 个答案:

答案 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的交易