簡體   English   中英

存在查詢未產生預期結果的T-SQL案例

[英]T-SQL Case When Exists Query Not Producing Expected Results

我整理了一個查詢,該查詢應顯示在選定日期之前和之后具有事件的每條記錄。 添加了額外的一列,如果記錄中有日期之前的事件,則將其設置為True / False,如果記錄中第二個日期之后具有事件,則將其設置為True / False。

問題是我知道事件表中有記錄,這些記錄的事件在第一個日期之前而不是在第二個日期之后,但是它們沒有出現在我的查詢中。 從這兩個查詢中得出的結果均為True。 不知道我在做什么錯。

SELECT DISTINCT DeviceName,dPhone,DSIMID,  Vehicles.reg, DeviceID,
CASE
WHEN EXISTS (SELECT eventID FROM [events] WHERE [events].sysdatetime < 
'2018-09-05 11:46:00.000')
THEN 'True' ELSE 'False' 
END AS [WasReportingBeforeDate],
CASE
WHEN EXISTS (SELECT eventID FROM [events] WHERE [events].sysdatetime > 
'2018-09-05 11:46:00.000')
THEN 'True' ELSE 'False' END AS [WasReportingAfterDate]
FROM [Devices]
INNER JOIN Vehicles ON Vehicles.DevID = Devices.DevID
INNER JOIN [events] ON Devices.DevID = [events].DeviceID;

電流輸出示例為:

Z3243   1  1 AA05 AAA 1 True    True

預期產量:

Z3243   1  1 AA05 AAA 1 True    False

沒有比第二個日期更新的記錄,因此它應返回false

我會將查詢分為2個單獨的查詢,並使用union all將結果集再次返回在一起。 如果您需要標記來確定事件,則可以將其硬編碼到以下查詢中。

   ;WITH EventsBefore AS 
    (
    SELECT DISTINCT
           DeviceName,
           dPhone,
           DSIMID,
           Vehicles.reg,
           DeviceID,
    FROM [Devices]
         INNER JOIN Vehicles ON Vehicles.DevID = Devices.DevID
         INNER JOIN [events] ON Devices.DevID = [events].DeviceID
         INNER JOIN lastEvent ON Devices.DevID = lastEvent.devID;
    WHERE [events].sysdatetime < '2018-09-05 11:46:00.000'

    )

     ,EventsAfter AS 
    (
    SELECT DISTINCT
           DeviceName,
           dPhone,
           DSIMID,
           Vehicles.reg,
           DeviceID,
    FROM [Devices]
         INNER JOIN Vehicles ON Vehicles.DevID = Devices.DevID
         INNER JOIN [events] ON Devices.DevID = [events].DeviceID
         INNER JOIN lastEvent ON Devices.DevID = lastEvent.devID;
    WHERE WHERE [events].sysdatetime > '2018-09-05 11:46:00.000'

    )

    SELECT * FROM EventsBefore
    UNION ALL 
    SELECT * FROM EventsAfter

您沒有關聯EXISTS ,因此,如果表中存在[events].sysdatetime > '2018-09-05 11:46:00.000'任何記錄,則您的EXISTS將始終返回true。

您想要這樣的東西:

...
CASE WHEN EXISTS (SELECT *
                  FROM [events] e2
                  WHERE e2.sysdatetime > '2018-09-05 11:46:00.000'
                  AND e2.eventID = e.eventID) --here
...
FROM [Devices] d
INNER JOIN Vehicles v ON b.DevID = d.DevID
INNER JOIN [events] e ON d.DevID = e.DeviceID;
  1. 擺脫參加events ,隨時刪除多余的DISTINCT
  2. 將連接謂詞放入現在丟失的子查詢中

像那樣:

SELECT DeviceName,dPhone,DSIMID,  Vehicles.reg, DeviceID,
CASE
  WHEN EXISTS (SELECT 1 FROM [events] e 
    WHERE e.sysdatetime < '2018-09-05 11:46:00.000'
    AND e.DeviceID = Devices.DevID)
  THEN 'True' ELSE 'False' 
END AS [WasReportingBeforeDate],
CASE
  WHEN EXISTS (SELECT 1 FROM [events] e 
    WHERE e.sysdatetime > '2018-09-05 11:46:00.000'
    AND e.DeviceID = Devices.DevID)
THEN 'True' ELSE 'False' END AS [WasReportingAfterDate]
FROM [Devices]
INNER JOIN Vehicles ON Vehicles.DevID = Devices.DevID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM