SQL存在返回的记录多于IN

时间:2018-07-13 18:29:40

标签: sql-server exists

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

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进行过滤的,所以我认为它只会返回过滤后的记录。

1 个答案:

答案 0 :(得分:2)

您应该在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个值没有多大意义。