![](/img/trans.png)
[英]SQL select from 2 tables where values in the second table might be absent
[英]SELECT records from two tables where rows might not present in the second table (related to LEFT JOIN)
我有兩個表 - Module和Access 。
模塊- 具有模塊列表的主表。
訪問- 具有相應權限的用戶和模塊的映射(如果用戶對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”的相應訪問權限)-
您可以將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.