我有一個用戶表與下面的架構,我如何獲得ID爲管理人員名單?
UserId, Name, ManagerId
該經理ID,不過是一個用戶ID作爲管理者也是一個用戶。
我可以得到經理使用下面的查詢列表,但我如何得到managerId與名稱?
Select DISTINCT(ManagerId) from Users
group by ManagerId
我想下面的輸出
ManagerId, Name
我有一個用戶表與下面的架構,我如何獲得ID爲管理人員名單?
UserId, Name, ManagerId
該經理ID,不過是一個用戶ID作爲管理者也是一個用戶。
我可以得到經理使用下面的查詢列表,但我如何得到managerId與名稱?
Select DISTINCT(ManagerId) from Users
group by ManagerId
我想下面的輸出
ManagerId, Name
試試這個:
SELECT UserId, Name
FROM Permission
WHERE UserId IN (Select DISTINCT ManagerId FROM Permission)
還可能有JOIN
:
SELECT UserId, Name
FROM Permission AS p1
JOIN (Select DISTINCT ManagerId FROM Permission) AS p2
ON p1.UserId = p2.MAnagerId
我相信你想找回誰是用戶經理。
SELECT DISTINCT UserId, Name
FROM Permission p1
WHERE EXISTS (
SELECT 1
FROM Permission p2
WHERE p1.UserId = p2.ManagerId
)
DISTINCT
子句是可選的,並且可以根據您的數據是多餘的:這可以通過使用EXISTS
子句來完成。如果是這種情況,請移除它以提升性能(不同的是需要對輸入進行排序,然後刪除重複項)。
我不確定是否將IN
與DISTINCT
一起使用是個好主意,例如Giorgos建議的。 SQL Server有一個很好的優化引擎,但是我對這樣的語句有不好的經驗。
更好地利用EXISTS
SELECT P1.UserId, P1.Name
FROM Permission AS P1
WHERE EXISTS (
SELECT *
FROM Permission AS P2
WHERE P2.ManagerId = P1.UserId
);
請記住,這將是對Permission
表的索引,其中第一個索引列將UserId
,而在另一個指標ManagerId
一個好主意。這種方式EXISTS
將非常有效地執行。
這應該是最有效的方法? – NoobDeveloper
我認爲第二個查詢比第一個查詢更高效。 –