2016-04-22 8 views
0

への参加はない参加します。この特定のクエリは、termDataに関連する複数のテーブルにデータをインポートする、より大きなストアドプロシージャの一部です。は、私は次のクエリを持つ単一レコード

sprocを実行すると、fm_stg.classByStudent_termData_assessmentDataにレコードが挿入されますが、termDataには挿入されません。この問題が発生したときには1つのレコードしか挿入しませんが、これまでに行った10,000レコードでは機能します。私は左の結合を使用して、データベースのテーブルにすでに存在するものを確立し、それ以外のものを確立し、ステージングテーブルから関連するレコードを取得します。ただし、このレコードの場合:

316a, 39520, DEC 10, Yes, DEC10, 105713, DEC 10 (18), 6078, NULL, 2 

セレクトは何も返しません - これはなぜですか?レコードは私のtermDataテーブルには絶対に存在せず、ステージングテーブルの他のすべてのテーブルにレコードが挿入されます。レコードがいくつかのテーブルに挿入され、他のテーブルに挿入されないこのシナリオを避けるために、sprocはすべての挿入をトランザクション内で実行していますが、動作していないようです。

+0

レコードを取得できない唯一の理由は、WHERE句でなければなりません。それを削除し、変更された選択クエリを実行して、予期せず取得した内容を確認します。 –

+0

問題を再現するSQL Fiddleを作成できますか?私は質問に何か間違っているとは思わない。 –

+0

@TabAlleman SQL Fiddleでこれを作成しようとしましたが、これは私の人生にとっては何もできません。テーブルを作成します。編集:それはFirefoxで動作するようではない...デモを作成します。 – Ben

答えて

1

クエリは前の10,000レコードに対して機能しましたが、現在のクエリでは機能しません。あなたのクエリに奇妙に見えるのは、ON句の3番目の行で、フィールド(studentID)とそれ自身を比較します。

On fm_stg.classByStudent_termData_assessmentData.class_code = termData.course 
and fm_stg.classByStudent_termData_assessmentData.termID = termData.termID 
and fm_stg.classByStudent_termData_assessmentData.studentID = fm_stg.classByStudent_termData_assessmentData.studentID 

私はちょうどここに推測しますが、このラインとして、ON句のであるあなたも、学生のIDを比較したかったのですか?だから、あなたはクエリが今まで働いていて、学生IDにつまずいてしまったのが幸運なことかもしれません。私はON句は次のようになりますと仮定:ところで

On fm_stg.classByStudent_termData_assessmentData.class_code = termData.course 
and fm_stg.classByStudent_termData_assessmentData.termID = termData.termID 
and fm_stg.classByStudent_termData_assessmentData.studentID = termData.studentID 

、クエリは表の別名を使用して、より読みやすい取得します。次のクエリでは、私はfm_stg.classByStudent_termData_assessmentDatatermDataためtdためadを使用します。

Insert into cet_database.dbo.termData 
(
    termID, 
    studentID, 
    course, 
    [current], 
    program, 
    StbyCurrentClassID, 
    class, 
    classCode, 
    cancelled 
) 
Select 
    ad.termID, 
    ad.studentID, 
    ad.class_code, 
    case when ad.[current] = 'Yes' then 1 else 0 end, 
    ad.program, 
    ad.classByStudentID, 
    ad.class, 
    ad.classID, 
    case when ad.cancelled_flag = 1 then 1 else 0 end 
From fm_stg.classByStudent_termData_assessmentData ad 
Left Outer Join termData td On ad.class_code = td.course 
          And ad.termID  = td.termID 
          And ad.studentID = td.studentID 
Where td.StbyCurrentClassID is null; 

有無をチェックするときにまた、なぜあなたは抗参加トリックを使うのですか?あなたはまっすぐに問題があったNOT EXISTS?本当に必要なときにのみトリックを使用してください。あなたも発生していることができなかったようなタイプミスして相関していないが、SQL Serverが機能しませんされて、あなたもNOT INを使用している可能性が他のDBMS(すなわちWhere (class_code, termId, studenId) Not In (Select ...))で

Insert into cet_database.dbo.termData 
(
    termID, 
    studentID, 
    course, 
    [current], 
    program, 
    StbyCurrentClassID, 
    class, 
    classCode, 
    cancelled 
) 
    Select 
    termID, 
    studentID, 
    class_code, 
    case when [current] = 'Yes' then 1 else 0 end, 
    program, 
    classByStudentID, 
    class, 
    classID, 
    case when cancelled_flag = 1 then 1 else 0 end 
    From fm_stg.classByStudent_termData_assessmentData ad 
    Where Not Exists 
    (
    Select * 
    From termData td 
    Where ad.class_code = td.course 
     And ad.termID  = td.termID 
     And ad.studentID = td.studentID 
); 

を次のようにクエリが良く読み込み残念ながらIN句のタプル。

+0

私は親しみを忘れた以外には特に反対の理由がないのに、何か他のものを提案してくれたので、「アンチ・ジョイント」トリックを使用します。私は「存在しない」のパフォーマンスが良いと推測していますか?私が持っていた問題は、レコードが関連するテーブル全体に挿入されていて、 'termData'テーブルには挿入されていないということでした。私はまだこれが私のsprocから来た理由を本当に理解していませんが、関連するテーブルのすべてのレコードを削除すると動作するようです。これは私のソース(リンクされていないサーバー/データベースは私のものではない)からの悪いレコードのために、最初に破った。ご協力いただきありがとうございます。 – Ben

関連する問題