各PolicyNumber
は複数のを持つことができます。そのため、すべての関連する列が のすべてを含むPolicyNumber
をすべて削除することが目標です。少なくとも1つが削除されることが選択されている場合はClassCode's
です。 PolicyNumber
とWrittenPremium
(WP)のcte1
があり、PolicyNumber
とClassCode
のテーブルtblClassCodesPlazaCommercial
があります。私WHERE
句イム選んで :次に同じEXISTSが異なる結果を返す理由
WHERE EXISTS (
SELECT DISTINCT PolicyNumber
FROM tblClassCodesPlazaCommercial
WHERE PolicyNumber NOT IN (SELECT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE ClassCode =5151)
)
私はまだClassCodeとポリシーを持っているI select * from cte3 WHERE ClassCode =5151
場合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))
しかし、その後、私が@PoliciesThatDontHaveClassCodes表をPolicyNumberで宣言すると、ClassCodeを持たない5151と私の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)
どういう違いがありますか?両方のサブクエリ自体がまったく同じ結果セットを返します。なぜ最初のケースではうまくいかないのですが、2番目(@PoliciesThatDontHaveClassCodesを宣言したとき)に動作しますか? どのようにテーブル変数を宣言せずに同じ結果を得ることができますか?外部クエリとサブクエリの間に相関がないあなたが
WHERE EXISTS (SELECT DISTINCT PolicyNumber
FROM tblClassCodesPlazaCommercial
WHERE PolicyNumber NOT IN (SELECT PolicyNumber
FROM tblClassCodesPlazaCommercial
WHERE ClassCode =5151))
を提供最初のサンプルで
が、それは同じではありません。 1つは、NOT IN(SELECT ....)を持ち、もう1つは違う条件を持っています。 2番目のクエリは実際には 'EXISTS'の結果を外部テーブルに関連づけていますが、最初の行は行が存在するかどうかを確認するだけです。存在しているので、外側テーブルのすべての結果に対して真です – Lamak