2017-10-19 59 views
0

我有这样的表的列表:合并多个表共享列

T1

ID | Name 
3 | 'AAA' 
4 | 'BBB' 
5 | 'CCC' 
6 | 'DDD' 
7 | 'EEE' 

T2

ID | Password 
3 | 'test' 
6 | 'password' 

T3

ID | Birth Year | Last Name 
4 | 1990 | 'John' 
6 | 1988 | 'Megan' 
7 | - | 'Bob' 

T4

ID | Birth Year 
7 | 1985 

我想将它们全部合并到这里,注意到t3和t4都有出生年份列,但该值只会出现在任意一列中。

ID | Name | Password | Birth Year | Last Name 
3 | 'AAA' | 'test' |  -  |  - 
4 | 'BBB' | -  |  1990 | 'John' 
5 | 'CCC' | -  |  -  |  - 
6 | 'DDD' |'password'|  1988 | 'Megan' 
7 | 'EEE' | -  |  1985 | 'Bob' 

有谁知道如何可以做到这一点? t1是“主”表,因此它将始终包含所有ID。

我已经试过:

select * \ 
from t1 \ 
LEFT outer join t2 on t1.ID = t2.ID \ 
LEFT outer join t3 on t1.ID = t3.ID \ 
LEFT outer join t4 on t1.ID = t4.ID 

但它不正常工作,它在T1,T2,T3每个单独列单独的列,T4

+0

你需要OUTER JOIN。例如:t1左外连接t2左外连接t3左外连接t4。 –

+0

看到这个:https://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join –

+0

我将修改我@AlKepp – Joe

回答

0

你可以选择离开加入T4至T1 ,那么显示t4.BirthYear是否为空,否则显示t3.BirthYear。像这样:

SELECT t1.ID, t1.Name, t2.Password, COALESCE(t4.BirthYear, t3.BirthYear) as BirthYear, t3,LastName 
FROM t1 
LEFT OUTER JOIN t2 on t1.ID = t2.ID 
LEFT OUTER JOIN t3 on t1.ID = t3.ID 
LEFT OUTER JOIN t4 on t1.ID = t4.ID and t4.BirthYear is NOT NULL 
+0

...你有一个错字(了't4.BirthYear'引用的一个可能应该是't3'),但更大的问题是你加入't4',这很可能不保证附加条件。 –

+0

是的,你是对的,第二个应该是t3,因为如果t4连接条件已经满足,那么它意味着t4。生命年有价值。所以Coalesce的第一个理由应该是t4BirthYear。有了这个额外的解释t4连接不应该是一个问题。 – Noxthron

0
select t1.ID, 
t1.Name, 
t2.Password, 
COALESCE(t3.[Birth Year],t4.[Birth Year]), t3.[Last Name] 
from t1 
LEFT outer join t2 on t1.ID = t2.ID 
LEFT outer join t3 on t1.ID = t3.ID 
LEFT outer join t4 on t1.ID = t4.ID