0

これらの 2 つの SELECT が同等かどうかを判断するのを手伝ってもらえますか?

SELECT sd.SESSION_DATA_ID
FROM SessionData sd
WHERE sd.DEVICE_TYPE = 'TRAC'
    AND (EXISTS
          (SELECT sr.ID
           FROM SessionResult sr
           LEFT JOIN BarcodeValues bv ON 
                sr.BARCODE_VALUE_0 = bv.ID AND 
                sr.SESSION_DATA_ID = sd.SESSION_DATA_ID AND
                sr.EVENT_NAME = 'Multi Full Cntr'
           WHERE
             bv.ENCRYPTED_VALUE LIKE '' OR bv.ENCRYPTED_VALUE IS NULL))

SELECT
    DISTINCT sd.SESSION_DATA_ID
FROM SessionData sd
LEFT JOIN SessionResult sr ON sd.SESSION_DATA_ID = sr.SESSION_DATA_ID
LEFT JOIN BarcodeValues bv ON bv.ID = sr.BARCODE_VALUE_0
WHERE
    sd.DEVICE_TYPE = 'TRAC' AND
    (sr.EVENT_NAME = 'Multi Full Cntr' AND
    bv.ENCRYPTED_VALUE LIKE '' OR bv.ENCRYPTED_VALUE IS NULL) OR
    sr.EVENT_NAME is NULL
4

2 に答える 2

3

いいえ、そうではないです。2つ目は、JOINが追加されているため、一致ごとに複数の行を生成します。DISTINCTを追加してこれを元に戻そうとしていますが、それは同じではありません。SessionData.SESSION_DATA_IDが一意のキーである場合、結果一致する可能性がありますが、結果が最初のクエリと一致するという事実は、の固有のプロパティではなく実際の値(一意性)に起因する副作用であるため、同じクエリではありません。リクエスト(クエリ)。QED。

于 2012-10-03T13:04:23.560 に答える
3

これはそれを違うものにします

または sr.EVENT_NAME が NULL です

最初は sr.EVENT_NAME が NULL で一致しません
2 番目はsr.EVENT_NAME が NULL で一致します

2 番目は 2 つの状況で一致します -
sd.SESSION_DATA_ID = sr.SESSION_DATA_ID で一致しません
- sd.SESSION_DATA_ID = sr.SESSION_DATA_ID で一致し、sr.EVENT_NAME は NULL です

最初の選択は、あなたが思っていることをしていないのではないかと思います
WHERE の OR IS NULL は、結合が一致しない行を返します
以下は同等ではありません

SELECT sr.ID
FROM SessionResult sr
LEFT JOIN BarcodeValues bv 
  ON  sr.BARCODE_VALUE_0 = bv.ID 
 AND  sr.SESSION_DATA_ID = sd.SESSION_DATA_ID 
 AND  sr.EVENT_NAME = 'Multi Full Cntr'
WHERE bv.ENCRYPTED_VALUE LIKE '' OR bv.ENCRYPTED_VALUE IS NULL

SELECT sr.ID
FROM SessionResult sr
JOIN BarcodeValues bv 
  ON  sr.BARCODE_VALUE_0 = bv.ID 
 AND  sr.SESSION_DATA_ID = sd.SESSION_DATA_ID 
 AND  sr.EVENT_NAME = 'Multi Full Cntr'
 AND (bv.ENCRYPTED_VALUE LIKE '' OR bv.ENCRYPTED_VALUE IS NULL)

私はこれがあなたが意味するものだと思います/欲しいのは:

SELECT distinct sd.SESSION_DATA_ID
FROM SessionData sd
JOIN SessionResult sr 
  ON sd.SESSION_DATA_ID = sr.SESSION_DATA_ID 
 AND(sr.EVENT_NAME = 'Multi Full Cntr' or sr.EVENT_NAME is NULL)
JOIN BarcodeValues bv 
  ON bv.ID = sr.BARCODE_VALUE_0
 AND(bv.ENCRYPTED_VALUE = '' OR bv.ENCRYPTED_VALUE IS NULL) 
WHERE sd.DEVICE_TYPE = 'TRAC'

AND は OR の前に処理されます

演算子の優先順位 (Transact-SQL)

  select 'yes' 
  where 1 = 0 and 0 = 1 or 1 = 1 
于 2012-10-03T13:18:59.723 に答える