簡體   English   中英

SELECT 來自兩個表的記錄,其中行可能不存在於第二個表中(與 LEFT JOIN 相關)

[英]SELECT records from two tables where rows might not present in the second table (related to LEFT JOIN)

我有兩個表 - ModuleAccess

模塊- 具有模塊列表的主表。

訪問- 具有相應權限的用戶和模塊的映射(如果用戶對HasAccess的相應模塊具有權限,則值為 1,如果用戶沒有權限,則HasAccess的值為 0 或該行不存在)

要求- 我需要一個包含特定用戶各自權限的所有模塊名稱的列表。 (棘手的部分 - 沒有必要根據Access表的結構將所有模塊都存在於特定用戶的映射表中,如上所述)

請查看我的查詢,它運行良好,並且涵蓋了所有場景。 我想知道除此之外是否有更好的方法,或者您是否發現我的方法有任何問題。

-- Table Module
IF (OBJECT_ID('tempdb..#Module') IS NOT NULL)
    DROP TABLE #Module

CREATE TABLE #Module (
    [ID] INT PRIMARY KEY
    ,[Name] VARCHAR(20)
    )

INSERT #Module (
    [ID]
    ,[Name]
    )
VALUES (1, 'Module 1')
    ,(2, 'Module 2')
    ,(3, 'Module 3')
    ,(4, 'Module 4')
    ,(5, 'Module 5')

-- Table Access
IF (OBJECT_ID('tempdb..#Access') IS NOT NULL)
    DROP TABLE #Access

CREATE TABLE #Access (
    [ID] INT FOREIGN KEY REFERENCES #Module([ID])
    ,[UserName] VARCHAR(20)
    ,[HasAccess] BIT
    )

INSERT #Access (
    [ID]
    ,[UserName]
    ,[HasAccess]
    )
VALUES (2, 'User 1', 1)
    ,(3, 'User 2', 1)
    ,(4, 'User 2', 0)
    ,(4, 'User 1', 0)
    ,(5, 'User 1', 1)

-- List of modules and respective access for 'User 1'
DECLARE @UserName VARCHAR(20) = 'User 1'

SELECT #Module.[Name] AS [Module]
    ,ISNULL(#Access.[HasAccess], 0) AS [Access]
FROM #Module
LEFT JOIN #Access ON #Access.[ID] = #Module.[ID]
    AND #Access.[UserName] = @UserName

表格模塊的內容 -

表格模塊的內容

用戶的表訪問內容 - '用戶 1' -

用戶的表訪問內容 - '用戶 1'

結果(模塊列表和“用戶 1”的相應訪問權限)-

“用戶 1”的模塊列表和各自的訪問權限

您可以將exists用作子查詢:

select m.*,
       (case when exists (select 1
                          from #access a
                          where a.id = m.id and a.username = 'User 1' and
                                a.HasAccess = 1
                         )
             then 1 else 0
        end) as has_access
from #modules m;

@ Amit11794,如果您想要特定用戶的結果,您將作為硬編碼值或變量傳遞,那么您的方法是正確的。

但是,如果您希望從單個查詢中一次獲得所有用戶的結果,您可以使用以下方法。

SELECT #Module.*,users.UserName, isnull(#Access.HasAccess ,0) as HasAccess
FROM #Module
cross join (select distinct Username from #Access) users
left join #Access on #Module.id = #Access.id and users.username = #Access.UserName

結果集

ID          Name                 UserName             HasAccess
----------- -------------------- -------------------- ---------
1           Module 1             User 1               0
2           Module 2             User 1               1
3           Module 3             User 1               0
4           Module 4             User 1               0
5           Module 5             User 1               1
1           Module 1             User 2               0
2           Module 2             User 2               0
3           Module 3             User 2               1
4           Module 4             User 2               0
5           Module 5             User 2               0

暫無
暫無

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

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