我应该使用什么样的JOIN来加入这些表?

时间:2016-10-28 08:54:13

标签: sql-server

我正在尝试将以下三个表连接在一起,并创建所有桌面的概述以及任何已分配给其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,但返回了许多重复值。

4 个答案:

答案 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