[英]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;
events
,隨時刪除多余的DISTINCT
像那樣:
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.