アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQLServerのSQL文です。
dbo_TblAには以下のようなデータが2行入っています。(重複している)
SYAINCD XXXXX
StartDT 2011/1/1
EndDT 2011/12/31
YuukouDT 2011/1/2

以下のSQL文を発行すると、1行だけの結果を返してくるのですが
理由が分かりません。
まったく見たことのないSQL文の書き方なのでどう解釈してよいか分からず
困っています。
解釈いただけると大変助かります。

SELECT H.DT_Date, H.DT_EndDate
FROM dbo_TblA AS H
WHERE (((H.SYAINCD)="XXXXX") AND ((H.StartDT)=(SELECT MAX( K.StartDT)
FROM dbo_TblA K, dbo_TblA L
WHERE K.SYAINCD = H.SYAINCD
AND L.SYAINCD = K.SYAINCD
AND L.StartDT = K.StartDT
AND L.YuukouDT = K.YuukouDT
AND L.StartDT <= #2011/04/20#)) AND ((H.YuukouDT)=(SELECT MAX(H_ED.YuukouDT) FROM dbo_TblA H_ED
WHERE H.SYAINCD = H_ED.SYAINCD
AND H.StartDT = H_ED.StartDT
AND H_ED.YuukouDT <= #2011/04/20#)));

A 回答 (1件)

このSQLでは


>dbo_TblAには以下のようなデータが2行入っています。(重複している)
>SYAINCD XXXXX
>StartDT 2011/1/1
>EndDT 2011/12/31
>YuukouDT 2011/1/2
のデータが2レコードのみ存在する場合は2件のレコードが返されると思います。

dbo_TblAのStartDTに2011/1/2以降のデータまたはYuukouDTに2011/1/3以降のデータが
1レコードのみ存在した場合SQLの結果がはじめて1レコードになります。(もちろんSYAINCD='XXXXX')

条件文を
(H.StartDT)=(
SELECT MAX( K.StartDT)
FROM dbo_TblA K, dbo_TblA L
WHERE K.SYAINCD = H.SYAINCD
AND L.SYAINCD = K.SYAINCD
AND L.StartDT = K.StartDT
AND L.YuukouDT = K.YuukouDT
AND L.StartDT <= '2011/04/20')

(H.YuukouDT)=(
SELECT MAX(H_ED.YuukouDT) FROM dbo_TblA H_ED
WHERE H.SYAINCD = H_ED.SYAINCD
AND H.StartDT = H_ED.StartDT
AND H_ED.YuukouDT <= '2011/04/20')
にわけて考えればわかりやすいと思います。

何を抽出するSQLかわかりませんがこんな奇怪なSQLは書かないように努力しましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。大変助かりました!

お礼日時:2011/10/20 10:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!