如何正确使用 EXISTS 子句

How would be the right way to use EXISTS clause

在我的 SP 中,我正在创建一个临时 table #PolicyNumbers 并根据将提供给 SP 的参数用 Policy Numbers 填充它。

CREATE TABLE #PolicyNumbers  (PolicyNumber varchar(50))
INSERT INTO #PolicyNumbers SELECT   PolicyNumber
                            FROM    PlazaInsuranceWPDataSet 
                            WHERE   State IN (SELECT * FROM [dbo].[StringOfStringsToTable](@State,','))  
                            AND Coverage IN (SELECT * FROM [dbo].[StringOfStringsToTable](@Coverage,','))
                            AND SICCode IN (SELECT * FROM [dbo].[StringOfStringsToTable](@SICCode,','))

在我的 SP 的下方,我使用 EXISTS 语句仅过滤那些 PolicyNumber 根据参数选择的。

WHERE   EXISTS (SELECT PolicyNumber FROM #PolicyNumbers pn WHERE pn.PolicyNumber = piwp.PolicyNumber)

所以 #PolicyNumbers 的结果确实包含重复的 PolicyNumbers:

然后在我的 SP 中我有 SELECT 语句并且结果也包含重复的 PolicyNumbers:

SELECT 
            PolicyNumber,
            Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate,
            Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate,
            WrittenPremium
            FROM PlazaInsuranceWPDataSet

现在我正在使用 EXIST 语句:

SELECT 
        PolicyNumber,
        Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate,
        Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate,
        WrittenPremium
        FROM PlazaInsuranceWPDataSet piwp
        WHERE   EXISTS (SELECT PolicyNumber FROM #PolicyNumbers pn WHERE pn.PolicyNumber = piwp.PolicyNumber)

目前一切都正确吗? 如果是,那么为什么我使用 SELECT 语句并使用 IN (@MyParameter) 在 WHERE 子句中传递相同参数的结果略有不同?

SELECT 
            PolicyNumber,
            Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate,
            Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate,
            WrittenPremium
            FROM PlazaInsuranceWPDataSet piwp
            WHERE    State IN (@State) 
                    AND SICCode IN (@SICCode)
                    AND Coverage IN (@Coverage)

您的两个查询之间的区别在于,第一个查询获取保单编号列表,其中 table 中的至少一行与 StateSICodeCoverage。由于 PlazaInsuranceWPDataSet 中有多行并且每一行可以有不同的 StateSICodeCoverage(大概),这与仅从 [=14 中选择行不同=] 匹配这三个谓词。

这是一个简化的例子:

Create Table PlazaInsuranceWPDataSet  (
    PolicyNumber varchar(1),
    State varchar(3))

Insert Into PlazaInsuranceWPDataSet 
Values  ('A', 'Qld'),
        ('A', 'NSW');

Create Table #PolicyNumbers (PolicyNumber char(1));
Insert Into #PolicyNumbers
Select PolicyNumber
  From PlazaInsuranceWPDataSet 
  Where State = 'Qld';

-- Returns all policy numbers where at least one row matches the predicate.
Select *
  From PlazaInsuranceWPDataSet As piwp
  Where Exists (Select 1 From #PolicyNumbers As pn
                Where pn.PolicyNumber = piwp.PolicyNumber);

-- Returns only rows of 'A' that match the filter predicate                    
Select *
  From PlazaInsuranceWPDataSet 
  Where State = 'Qld';

保单编号 'A' 的行中有一个(且只有一个)符合条件,因此当我们在临时 table 中写下该保单编号并稍后与它进行比较时,我们将返回 'A' 的所有行。