0

你能帮我确定这两个 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

不,他们不是。由于添加了 JOIN,第二个会为每个匹配生成多行。您正试图通过添加 DISTINCT 来撤消此操作,但这并不相同。如果SessionData.SESSION_DATA_ID 是唯一键,则结果可能匹配,但不是同一个查询,因为结果与第一个查询匹配的事实是实际值(唯一性)而不是固有属性的副作用请求(查询)。QED。

于 2012-10-03T13:04:23.560 回答
3

这使它与众不同

或 sr.EVENT_NAME 为 NULL

首先将不匹配 sr.EVENT_NAME 为 NULL
第二个将匹配 sr.EVENT_NAME 为 NULL

第二个将在两种情况下
匹配 - 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 回答