【问题标题】:SQL Exists Returns more records than INSQL Exists 返回比 IN 更多的记录
【发布时间】:2018-12-22 04:21:38
【问题描述】:

我正在运行两个查询进行比较:

SELECT 
    PD.PRACTITIONERID, PD.LastName, PD.FirstName, PD.NationalProviderID
FROM 
    vwPractitionerDemographics PD
WHERE 
    EXISTS (SELECT 1 FROM vwPractitionerLocations
            WHERE PracticeTaxIDNumber = '59-1205165')

SELECT  
    PD.PRACTITIONERID, PD.LastName, PD.FirstName, PD.NationalProviderID
FROM 
    vwPractitionerDemographics PD
WHERE 
    PRACTITIONERID IN (SELECT practitionerID FROM vwPractitionerLocations
                       WHERE PracticeTaxIDNumber = '59-1205165')

带有EXISTS 子句的查询返回11,000 条记录,包括那些没有过滤的PracticeTaxIDNumber。带有IN 子句的查询返回169 条记录,并产生正确的结果。

有人可以解释为什么EXISTS 在这里不起作用吗?

我知道EXISTS 在条件为真时返回记录,但由于条件是用PracticeTaxIDNumber 过滤的,我认为它只会返回过滤后的记录。

【问题讨论】:

  • vbPractionerDemographics 表中的每条记录单独运行EXISTS 查询。 PracticeTaxIDNumber 总是设法存在(它怎么可能不存在)在您的 vwPRactionerLocations 表中,因此返回每条记录。
  • 至于您的 IN,您的 Demo 表中只有 169 条记录,其中 PractionerIdPracticeTaxIDNumber59-1205165
  • EXIST 为每条记录运行,如果内部查询返回任何内容,则计算结果为 trueSELECT 1 FROM vwPractitionerLocations WHERE PracticeTaxIDNumber = '59-1205165' 将为vwPractitionerDemographics每条记录 返回true,因为该查询将总是 返回至少一个结果。
  • 你是说 Exists 只是评估条件是否为真?即,如果确实存在 PracticeTaxIDNumber = xxx 的记录,则运行主查询 - Exists 查询实际上独立于主查询。如果 Exists 为 True,则运行主查询。

标签: sql-server exists


【解决方案1】:

您应该在 WHERE 子句中使用 JOIN 或将 EXISTS 与连接一起使用。

SELECT PD.PRACTITIONERID, PD.LastName, PD.FirstName, PD.NationalProviderID
FROM vwPractitionerDemographics PD
WHERE EXISTS
(SELECT 1 
    FROM vwPractitionerLocations
    WHERE PracticeTaxIDNumber = '59-1205165'
    AND vwPractitionerLocations.[matching column here] = PD.[matching column here])
SELECT PD.PRACTITIONERID, PD.LastName, PD.FirstName, PD.NationalProviderID
FROM vwPractitionerDemographics PD INNER JOIN vwPractitionerLocations ON vwPractitionerLocations.[matching column here] = PD.[matching column here])
WHERE PracticeTaxIDNumber = '59-1205165'

SQL Server 无法猜测您希望查询中的表如何相互关联,您必须明确提供该信息。使用IN,在本例中为, was not correct as it should be used when evaluating multiple values. In your case you are passing a single value to be evaluated. If you really want to use IN then you would write...WHERE PracticeTaxIDNumber IN ('59-1205165')` 但我认为您可以看到这对于 1 值没有多大意义。

【讨论】:

  • 现在完全明白了。谢谢!
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多