如何正确使用 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
语句并且结果也包含重复的 PolicyNumber
s:
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 中的至少一行与 State
、SICode
和Coverage
。由于 PlazaInsuranceWPDataSet
中有多行并且每一行可以有不同的 State
、SICode
和 Coverage
(大概),这与仅从 [=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' 的所有行。
在我的 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
语句并且结果也包含重复的 PolicyNumber
s:
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 中的至少一行与 State
、SICode
和Coverage
。由于 PlazaInsuranceWPDataSet
中有多行并且每一行可以有不同的 State
、SICode
和 Coverage
(大概),这与仅从 [=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' 的所有行。