连接共享一个公共列的三个表

Tch*_*hke 4 join sql-server

我有三个包含以下列的表:

Table 1: Hostname, OS, Confidence    
Table 2: Hostname, Manufacturer, Model, Serial_Number, Architecture, Memory    
Table 3: Hostname, MAC, Interface
Run Code Online (Sandbox Code Playgroud)

应该是这样,但我还不能确定,如果一个主机名存在于一个表中,那么它就会出现在所有三个表中。我不确定为什么这些数据被分成三个不同的表,但目前是这样,这就是我提出问题的原因。

如何将这三张表合二为一?我有以下将结合其中两个的内容,但我不确定如何修改它以包含 Table3:

SELECT
    COALESCE(Table1.Hostname, Table2.Hostname) AS Hostname,
    Manufacturer,
    Model,
    Serial_Number,
    Architecture,
    Memory
FROM Table1
FULL OUTER JOIN Table2
ON Table1.Hostname = Table2.Hostname
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 7

有(至少)两种方法可以FULL在 2 个以上的表之间编写连接。FULL JOIN多次使用,ON条件中的表达式会变长一点,但很简单:

SELECT
    COALESCE(t1.Hostname, t2.Hostname, t3.HostName) AS Hostname,
    t1.OS, 
    t1.Confidence, 
    t2.Manufacturer,  
    -- the rest, non common columns
FROM Table1 AS t1
  FULL OUTER JOIN Table2 AS t2
    ON t2.Hostname = t1.Hostname
  FULL OUTER JOIN Table3 AS t3
    ON t3.Hostname = COALESCE(t1.Hostname, t2.Hostname) ;
Run Code Online (Sandbox Code Playgroud)

首先使用UNION公共列的 a,然后LEFT加入:

SELECT
     u.Hostname,
    t1.OS, 
    t1.Confidence, 
    t2.Manufacturer,  
    -- the rest, non common columns
FROM 
    ( SELECT Hostname FROM Table1 UNION
      SELECT Hostname FROM Table2 UNION
      SELECT Hostname FROM Table3
    ) AS u 
  LEFT OUTER JOIN Table1 AS t1
    ON t1.Hostname = u.Hostname
  LEFT OUTER JOIN Table2 AS t2
    ON t2.Hostname = u.Hostname
  LEFT OUTER JOIN Table3 AS t3
    ON t3.Hostname = u.Hostname ;
Run Code Online (Sandbox Code Playgroud)