2016-10-28 44 views
2

我有以下三個表,我試圖聯合在一起,並創建一個所有桌面和任何人有一個分配給他們的用戶名(如果有的話)的概述。我應該用什麼樣的JOIN加入這些表格?

dbo.Users 
ID Name  Lastname JobTitle 
118 Ryan  Doe  Field Engineer 
119 Jessica Braun  Technical Consultant 
120 Daniel Sous  Web developer 
121 Amy  Amyson  Intern 
.. etc 

dbo.LightDesktops 
ID Model  MACAddress   UserID 
1  HP1234 AA:AA:AA:AA:AA:AA 118 
2  HP1234 BB:BB:BB:BB:BB:BB 121 
3  HP1234 AA:BB:BB:AA:BB:AA NULL 
4  HP1234 BB:AA:BB:AA:AA:BB 124 

dbo.MediumDesktops 
ID Model  MACAddress   UserID 
1 HP12PRO AA:AB:AA:BB:AA:BA 132 
2 HP12PRO BB:BA:AB:BA:BB:AA 119 
3 HP12PRO AA:BA:BA:AB:AA:BA 123 
4 HP12PRO BB:BB:BB:AB:BA:BB 241 

我設法弄清楚如何做到這一點每個類型的桌面,例如LightDesktops:

SELECT * FROM LightDesktops LEFT OUTER JOIN Users ON LightDesktops.UserID = Users.UserID 

,會告訴我他們的資料對臺式機的一個很好的概述,以及誰如果有的話有一個。

如果我想有一點用都沒有,因此在股票我可以做

SELECT * FROM LightDesktops LEFT OUTER JOIN Users ON LightDesktops.UserID = Users.UserID WHERE LightDesktops.UserID IS NULL 

我怎樣才能達到同樣的效果光桌面的概述,但包含的信息的兩個表我們的桌面?我試圖使用一個UNION,但返回了很多重複值。

+1

稍微偏離主題;你有沒有考慮將輕型和中型桌面合併成一張桌子?您可以添加一個額外的列來識別哪些是輕/中等。這種方法的好處是它會簡化你需要編寫的查詢。 –

+0

你可以添加一個你希望在輸出中看到哪些列的例子嗎? –

+2

採取@目的地數據的建議可能是合理的,但也可能無法進行此更改。或者,您可以使用'CREATE VIEW'在一個地方獲取連接邏輯,然後在所有後續查詢中使用該視圖,稍後您可以重構以刪除該視圖。 –

回答

2

使用UNION帶來的輕型和中型桌面表一起作爲一個單一的數據集不應該給你重複,除非該表包含重複值的行進行的跨所有您的SELECT條款中的列和您使用UNION ALL如果您知道您的表格具有唯一值,請使用UNION ALL來提高性能。

我將兩個表結合起來,公用表表達式(CTE),然後加入用LEFT OUTER JOIN產生的表也可過濾找到的條目不存在匹配WHERE [user].[UserID] IS NULL user表,NB,那將返回已刪除用戶的桌面表中的孤行行;或者丟棄左外連接,並使用WHERE [desktop].[UserID] IS NULL僅返回沒有受到攻擊的用戶的防打擊。

你可以試試下面的代碼;

WITH cte_Desktop AS 
(
    SELECT 
     [ID] as [DesktopID], 
     'Light Desktop' as [DekstopType], 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[LightDesktops] 

    UNION 

    SELECT 
     [ID], 
     'Medium Desktop', 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[MediumDesktops] 
) 

SELECT 
    [desktop].* 

FROM cte_Desktop AS [desktop] 
LEFT OUTER JOIN [dbo].[Users] AS [user] 
    on [user].[UserID] = [desktop].[UserID] 

WHERE [user].[UserID] IS NULL 
1

嘗試

WITH all as (
select model , userid from LightDesktops 
union 
select model , userid from MediumDesktops 
) 

select * FROM all where UserId IS NULL 
+0

你是對的謝謝。 –

1

使用Full join讓目前所有用戶的報告。它會給你完整的報告。在此之上結果查詢用戶id爲NULL

SELECT U.ID userid, 
     U.NAME, 
     LD.USERID LD_USERID, 
     LD.MODEL LIGHT_MODEL, 
     LD.MACADDRESS LIGHT_MAC, 
     LM.USERID LM_USERID, 
     LM.MODEL MEDIUM_MODEL, 
     LM.MACADDRESS MEDIUM_MAC 
FROM #USERS U 
     FULL OUTER JOIN #LIGHTD LD 
     ON (U.ID = LD.USERID) 
     FULL OUTER JOIN #LIGHTM LM 
     ON (LM.USERID = U.ID) 
1

雖然你可以實現你在一個查詢所需要的,它可能是更可支持打破錶工會伸到一個觀點,讓這個邏輯在多個查詢中重複使用,還允許在更容易重構以後的日子。

點到destination-data提醒我這一點。

查看

CREATE VIEW [dbo].[Desktops] AS 
(
    SELECT 
     [ID] as [DesktopID], 
     'Light Desktop' as [DekstopType], 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[LightDesktops] 

    UNION 

    SELECT 
     [ID], 
     'Medium Desktop', 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[MediumDesktops] 
) 

查詢

SELECT 
    [desktop].* 

FROM [dbo].[Desktops] AS [desktop] 
LEFT OUTER JOIN [dbo].[Users] AS [user] 
    on [user].[UserID] = [desktop].[UserID] 

WHERE [user].[UserID] IS NULL 
相關問題