我正在尝试将以下三个表连接在一起,并创建所有桌面的概述以及任何已分配给其UserID的人(如果有的话)。
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,但返回了许多重复值。
答案 0 :(得分:2)
使用UNION
将轻型和中型桌面表作为单个数据集放在一起不应该为您提供重复项,除非这些表在您的所有列中的行中包含重复值SELECT
条款,您使用UNION ALL
。 如果您知道自己的表格具有唯一值,请使用UNION ALL
来提升效果。
我将两个表组合在一个公用表表达式(cte)中,然后将结果表与LEFT OUTER JOIN
连接到您的用户表,也可以对其进行过滤以查找没有匹配项的条目{{1 ,NB,将返回用户已被删除的桌面表中的孤立行;或者删除左外连接并使用WHERE [user].[UserID] IS NULL
仅返回没有被分类用户的dekstops。
您可以尝试以下代码;
WHERE [desktop].[UserID] IS NULL
答案 1 :(得分:1)
尝试
WITH all as (
select model , userid from LightDesktops
union
select model , userid from MediumDesktops
)
select * FROM all where UserId IS NULL
答案 2 :(得分:1)
使用Full join
获取所有在线用户的报告。它会给你完整的报告。除此结果之外,userid的查询为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)
答案 3 :(得分: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