2009-05-20 4 views
0

おやすみ2つのSQL文の違いは何ですか?

私たちがしようとしているのは、トリガーの内側に、名前に「単独」という2つの料金を挿入していないことを確認することだけです。これらの手数料は個別に処理する必要があります。

何らかの理由で、2週間前にSQLの最上部が終了するように見えます。それを回避するために、私はそれを第2の方法で記録し、正しい結果を得る。私が混乱しているのは、なぜ最初の部分が過去数年間働いていたように見えますか?

SELECT @AloneRecordCount = count(*) 

FROM inserted i 
     INNER JOIN deleted d on i.id = d.id 

WHERE i.StatusID = 32 
     AND d.StatusID <> 32 
     AND i.id IN 
     (SELECT settlementid FROM vwFundingDisbursement fd 
     WHERE fd.DisbTypeName LIKE '%Alone' 
     AND fd.PaymentMethodID = 0) 


SELECT @AloneRecordCount = count(i.id) 

FROM inserted i INNER JOIN 
     deleted d on i.id = d.id 
     JOIN vwFundingDisbursement fd on i.id = fd.settlementid 

WHERE i.StatusID = 32 
     AND d.StatusID <> 32 
     AND fd.DisbTypeName like '%Alone' 
     AND fd.PaymentMethodID = 0 

これは、SQL Server 2005の
にエラーが下の文が見つかった実際の数を返しますしながら、代わりにトップ文が唯一の1またはゼロ
を返し、存在しません。

+0

どのようなエンジンがありますか? – gbn

+0

これはON DELETEトリガーですか? – Andomar

+0

更新後のトリガーです。 –

答えて

1

値でしょう助けてください...

配布タイプ名に "Alone"という値を持つvwFundingDisbursementの複数の行を探している場合、JOINはretuソース表(INSERTED)としての複数の行が、ビュー内の複数の行に結合されます。 INを使用すると、SQLは複数の一致を返すかどうかは気にしませんが、1行しか与えられません。例として

:サイドノートで

CREATE TABLE dbo.Test_In_vs_Join1 
(
    my_id  INT  NOT NULL 
) 

CREATE TABLE dbo.Test_In_vs_Join2 
(
    my_id  INT  NOT NULL 
) 

INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (1) 
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (2) 
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (3) 
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (4) 
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (5) 

INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (1) 
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (1) 
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (2) 
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (3) 
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (3) 

SELECT 
    T1.my_id, 
    COUNT(*) 
FROM 
    dbo.Test_In_vs_Join1 T1 
INNER JOIN dbo.Test_In_vs_Join2 T2 ON 
    T2.my_id = T1.my_id 
GROUP BY 
    T1.my_id 

SELECT 
    T1.my_id, 
    COUNT(*) 
FROM 
    dbo.Test_In_vs_Join1 T1 
WHERE 
    T1.my_id IN (SELECT T2.my_id FROM dbo.Test_In_vs_Join2 T2) 
GROUP BY 
    T1.my_id 

、このような別のカラムの内部カラムを埋め込むには、正規化された形式の違反だけ問題を求めています。トリガーでこの種のビジネスロジックを実行することは、あなたが探し出しているときには下に行く危険な道です。

+0

私はあなたが列を埋めることによって何を意味するか分かりませんが、私は確かに、ビジネスロジックをデータベースに入れないという考えに同意し、理解しています。トリガーはまったく好きではありませんが、私の判断ではありませんでした。 –

+0

これは正しいソリューションかもしれません。 IN句はvwFundingDisbursementで複数の行を検出しませんが、JOINは検索されます。埋め込まれた列はおそらくDisbTypeNameの最後にAloneです。それはそれ自身の列でなければなりません。 – Andomar

+0

私は、列を埋葬することによって、あなたは文字列DisbTypeNameを持っているようですが、その列には、同じ種類の他の手数料で料金を挿入できるかどうかのフラグが格納されています。 –

4

null vwFundingDisbursement.settlementidの値はありますか?最近現れましたか?

+0

それは私が見たことの一つでした。御時間ありがとうございます。 –

+1

+1副選択の行のいずれかがNULLの場合、 "i.id IN(...)"は真ではありません。 1つの決済IDが処理中に一時的にNULLであっても、これは失敗するリスクがあります。 – Andomar

+1

いいえ、INは連続するORで、NULLを処理します。 "NOT IN"はNULLに失敗します。これを参照してくださいhttp://stackoverflow.com/questions/129077/sql-not-in-constraint-and-null-values – gbn

0

COUNT(*)
数(i.id)

がNULLに基づいて異なるカウントを返しますが、スキーマ(あるいは少なくともビューが作成される方法)

In SQL, what’s the difference between count(*) and count('x')?

+0

しかし、ID列がNULLである可能性は低いです – Andomar

+0

@Andomar、うん、あなたがそれを指摘するまで、デュは気付かなかった。 –

0

私はこのMSSQL(?)とみなし、挿入/削除された両方のテーブルに参加しているのでUPDATE文を処理していますか?

このトリガーはどのテーブルにありますか?

関連する問題