4

私の上司はこのコードを私のやり方で投げました。内部結合の最後の ON ステートメントがどのように機能するかを理解するのに苦労しています。彼もそれを完全には理解していないと思います(しかし、それは仕事を成し遂げます)。SQL がどのように機能するかについてもっと知りたいと思っています。どうもありがとう!

オンステートメントはこちら

and (A.Submitted_Date > X.Submitted_Date)))

そして、ここにクエリがあります

    SELECT AA.ID, AA.Submitted_Date as Date_Status      
    FROM Report as AA 
    where AA.Submitted_Date in
    --START
       (
        SELECT X.Submitted_Date
        FROM Report as A 
        inner join  
       --Start Find All Dates Submitted
        (
         SELECT [ID],[Submitted_Date]
         FROM Report
          where not(Submitted_Date is null and  Cleared_Date is null)
          group by ID, Submitted_Date) as X 
        --End Find all Dates  Submittd
     --below is the conditions of the join


    ON A.ID = X.ID 
    and A.ID= AA.ID

    --THIS IS THE CONDITION I AM CONFUSED ABOUT!!!!
    and (A.Submitted_Date > X.Submitted_Date)))

    group by X.Submitted_Date)

   and not AA.Submitted_Date is null 
   group by AA.ID, AA.Submitted_Date

以下は、表 A の日付のサンプルです。

2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-12-10 00:00:00.000
2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-12 00:00:00.000

以下は、表 X の日付のサンプルです。

2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-10 00:00:00.000
2012-12-12 00:00:00.000

最後の条件の前の結果は次のとおりです

2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-10 00:00:00.000
2012-12-12 00:00:00.000

A.Sub > X.Sub での結果は次のとおりです。

2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-10 00:00:00.000

これらの日付が表示される理由がわかりません。AとXの間で何が比較されていますか? A の値は常に X と同じではないので、最終的なデータはありませんか? ご協力ありがとうございました!

4

2 に答える 2

2

結合条件は 2 つのことを行います。まず、 がx.Submitted_Datenull でないことを確認しています。whreこの種のものは、そのすぐ上のステートメントと真っ向から矛盾しています。そのステートメントでは、null でないSubmitted_Date場合Cleared_Dateは NULL になる可能性があります。

NULL でないかどうかのチェックは、使用されているだけです。結合は内部結合であるため、 と の一致する行のみxa保持されます。の場合x.Submitted_Date is null、比較A.Submitted_Date > X.Submitted_Dateは FALSE と評価されます (実際には NULL ですが、このコンテキストでは NULL は FALSE と同等です)。

第 2 に特定Reportid. これは、同じ比較によって発生しています: A.Submitted_Date > X.Submitted_DateAより後のレコードがあることを示していXます。Submitted_Date条件は、最大値を除く のすべての値で真です。

つまり、条件は、最新の日付を除いて、送信されたすべての日付値を取得しています。

条件は次と同等である可能性があります。

where AA.Submitted_Date <> (select MAX(x.Submitted_Date) from Report where x.id = AA.id)

私が言うのCleared_Date、これが疑わしいからです。でも、同じだと思います。元のクエリのwhere句は、x.Submitted_DateNULL でない場合は常に満たされます。クリアされた日付は追加の行をもたらす可能性がありますが、これらの送信日は null になります。したがって、送信された最大の日付を除くすべてを取得しています。

ロジックはさらに複雑になり、これはさらに単純化できる「単純化された」バージョンであると思います。

于 2013-03-28T18:00:51.140 に答える
2

データに ID フィールドが含まれているとよいでしょう。そして、IDは一意ではないと思います。さらに、あなたのサンプルの選択は、状況を理解するのに理想的ではないと思います.

あなたの質問に対するこれらの制限を考慮すると、あなたを混乱させているのは、実際には A.ID = X.ID という条件だと思います。これが、日付が同じであり、したがってデータがないはずであると考える理由です。

Report テーブルがある場合:

1 2012-11-27
1 2012-11-29

次に、クロス結合によって次が作成されます。

1 2012-11-27 1 2012-11-27
1 2012-11-27 1 2012-11-29
1 2012-11-29 1 2012-11-27
1 2012-11-29 1 2012-11-29

基準 A.ID = X.ID を通過し、次に A.date > X.date が返されます

1 2012-11-29 1 2012-11-27

編集: 「サンプルに基づいて、レコード 2012-11-27 は結果の一部であってはなりません。」を削除しました。取得されている日付フィールドは、A からではなく X からのものであるためです。

于 2013-03-28T18:06:09.333 に答える