【发布时间】:2017-04-01 03:48:04
【问题描述】:
每个PolicyNumber 可以有多个ClassCode。所以目标是消除整个PolicyNumber 与所有相关列
如果至少有一个ClassCode 选择被淘汰,则包括所有ClassCode's。
我有cte1 和PolicyNumber 和WrittenPremium(WP),我有表tblClassCodesPlazaCommercial 和PolicyNumber 和ClassCode。
在我的WHERE 子句中我选择:
WHERE EXISTS (
SELECT DISTINCT PolicyNumber
FROM tblClassCodesPlazaCommercial
WHERE PolicyNumber NOT IN (SELECT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE ClassCode =5151)
)
如果我 select * from cte3 WHERE ClassCode =5151 我仍然有 ClassCode 5151 的策略
下面的整个select语句:
select
cte1.PolicyNumber,
cte1.TransactionEffectiveDate,
cc.ClassCode,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY cte1.QuoteID, cte1.PolicyNumber, cc.TransactionEffectiveDate ORDER BY (SELECT 0))=1 THEN cte1.WP
ELSE 0
END as WP--,
from cte1 inner join tblClassCodesPlazaCommercial cc on cte1.PolicyNumber=cc.PolicyNumber AND cte1.QuoteID=cc.QuoteID AND cte1.TransactionEffectiveDate=cc.TransactionEffectiveDate
where EXISTS (SELECT DISTINCT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE PolicyNumber NOT IN (SELECT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE ClassCode =5151))
但是,如果我用没有 ClassCode 5151 的 PolicyNumber 声明 @PoliciesThatDontHaveClassCodes 表并在我的 EXISTS 命令中使用它 - 那么它就可以工作。
DECLARE @PoliciesThatDontHaveClassCodes Table (PolicyNumber varchar(100))
INSERT INTO @PoliciesThatDontHaveClassCodes SELECT DISTINCT PolicyNumber FROM tblClassCodesPlazaCommercial
WHERE PolicyNumber NOT IN (SELECT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE ClassCode =5151)
select
cte1.PolicyNumber,
cte1.TransactionEffectiveDate,
cc.ClassCode,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY cte1.QuoteID, cte1.PolicyNumber, cc.TransactionEffectiveDate ORDER BY (SELECT 0))=1 THEN cte1.WP
ELSE 0
END as WP--,
from cte1 inner join tblClassCodesPlazaCommercial cc on cte1.PolicyNumber=cc.PolicyNumber
AND cte1.QuoteID=cc.QuoteID
AND cte1.TransactionEffectiveDate=cc.TransactionEffectiveDate
where EXISTS (SELECT * FROM @PoliciesThatDontHaveClassCodes t WHERE t.PolicyNumber=cc.PolicyNumber )
有什么区别?两个子查询本身返回完全相同的结果集。为什么在第一种情况下它不起作用,但在第二种情况下(当我声明@PoliciesThatDontHaveClassCodes 时) - 它起作用了? 如何在不声明任何表变量的情况下获得相同的结果?
【问题讨论】:
-
但不一样。其中一个是
NOT IN (SELECT....),另一个是不同的条件。第二个查询实际上是将EXISTS的结果与外部表相关联,第一个查询只是查看是否存在任何行......并且由于它确实存在,因此外部表中的每个结果都是如此
标签: sql-server tsql exists notin