簡體   English   中英

SQL-用於EXIST檢查的SELECT子查詢AS BIT值

[英]SQL - SELECT subquery AS BIT value for EXIST check

我有個問題。

我正在嘗試獲取BIT值,以檢查昨晚晚上10點至午夜之間是否有人進入建築物。 當我自己運行子查詢代碼時,它將為我提供所需的結果。 當我使用SSRS2008時,我需要所有結果都放在同一存儲過程中。

所以問題是,它給了我一些正確的位值,對於那些顯然是假的,它給出了假,對於那些顯然是真的,它給出了真。 但是對於中間的那些人(白晝輪班,他們在23點離開),其結果有些隨機。

有人有線索嗎?

SELECT DISTINCT TOP 200 
   Events.LoggedTime, 
   PTUsers.Name, 
   PTDoors.PTDoorsID, 
   PTUsers.AccessLevel, 
   CAST(CASE 
           WHEN EXISTS (SELECT Events.LoggedTime 
                        FROM Events 
                        INNER JOIN PTUsers AS PTUsers_1 ON Events.GlobalIndex1 = PTUsers.GlobalRecord 
                        INNER JOIN PTDoors AS PTDoors_1 ON Events.RecordIndex2 + 1 = PTDoors.Address
                        WHERE (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE() - 1)) 
                          AND (DATEPART(hour, Events.LoggedTime) IN (22, 23)) 
                          AND (PTDoors_1.PTDoorsID = 14)) THEN 1 ELSE 0 END AS BIT) AS Night
FROM         
    Events 
INNER JOIN
    PTUsers ON Events.GlobalIndex1 = PTUsers.GlobalRecord 
INNER JOIN
    PTDoors ON Events.RecordIndex2 + 1 = PTDoors.Address
WHERE     
    (PTUsers.Panel = 0) 
    AND (PTDoors.Panel = 0) 
    AND (PTDoors.PTDoorsID = 14) 
    AND (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE()) - 1) 
    AND (PTUsers.AccessLevel IN (3))
ORDER BY 
    Events.LoggedTime DESC

我認為您不需要CAST,因為您通過將結果設置為EXISTS()來將Night明確定義為BIT,這有點。 我刪除了不正確的查詢。

我明白你的問題。 您沒有為子查詢中的聯接約束使用正確的表別名。

它應該是:

INNER JOIN PTUsers AS PTUsers_1 ON Events.GlobalIndex1 = PTUsers_1.GlobalRecord 
INNER JOIN PTDoors AS PTDoors_1 ON Events.RecordIndex2 + 1 = PTDoors_1.Address

另外,檢查並確保在聯接中使用正確的值。 我將更改以下內容進行測試。

FROM Events Events_2
INNER JOIN PTUsers AS PTUsers_1 ON Events_2.GlobalIndex1 = PTUsers_1.GlobalRecord 
INNER JOIN PTDoors AS PTDoors_1 ON Events_2.RecordIndex2 + 1 = PTDoors_1.Address

@lrd我做了您建議的更正,感謝您指出表別名:)

我刪除了演員表,所以現在我得到了BIT欄。 但現在的問題是,我得到的結果全為“ 1”。 讓我感到困惑的是,子查詢本身就可以作為查詢工作。 它可以追溯到一天,並在給定的時間范圍內顯示該門上的條目。

現在,我正在嘗試比較同一個人的信息,這意味着-我看到列表中有一個人,該人昨天早上6點到達,請檢查該人是否也在22點至午夜之間的前一天到達,並返回一個顯示的值那。

SELECT DISTINCT TOP 200 Events.LoggedTime, PTUsers.Name, PTDoors.PTDoorsID, PTUsers.AccessLevel, CASE WHEN EXISTS
                          (SELECT     Events.LoggedTime
                            FROM          Events INNER JOIN
                                                   PTUsers AS PTUsers_1 ON Events.GlobalIndex1 = PTUsers_1.GlobalRecord INNER JOIN
                                                   PTDoors AS PTDoors_1 ON Events.RecordIndex2 + 1 = PTDoors_1.Address
                            WHERE      (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE() - 1)) AND (DATEPART(hour, Events.LoggedTime) IN (22, 23)) AND 
                                                   (PTDoors_1.PTDoorsID = 14)) THEN 1 ELSE 0 END AS BIT
FROM         Events INNER JOIN
                      PTUsers ON Events.GlobalIndex1 = PTUsers.GlobalRecord INNER JOIN
                      PTDoors ON Events.RecordIndex2 + 1 = PTDoors.Address
WHERE     (PTUsers.Panel = 0) AND (PTDoors.Panel = 0) AND (PTDoors.PTDoorsID = 14) AND (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE()) 
                      - 1) AND (PTUsers.AccessLevel IN (3))
ORDER BY Events.LoggedTime DESC

暫無
暫無

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

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