连接多个表以生成一个数据源

时间:2015-02-11 21:54:14

标签: sql

我有四张格式相似但值不同的表格。

表A

| ID |日期|照片
| 14 | 10/10/24 | 1
| 15 | 10/11/24 | 2
| 16 | 10/12/24 | 1
| 17 | 10/13/24 | 1

表B

| ID |日期|照片
| 14 | 10/10/24 | 1
| 15 | 10/11/24 | 1
| 17 | 10/16/24 | 1
| 18 | 10/17/24 | 1

表C
| ID |日期|照片
| 14 | 10/10/24 | 1
| 15 | 10/11/24 | 4
| 19 | 10/18/24 | 4
| 20 | 10/19/24 | 1

我需要获得一个如下所示的数据源,即上表的完全外连接,其中ID和Date字段是唯一具有非值的字段。

表C

| ID |日期|照片|图片|猫

| 14 | 10/10/2014 | 1 | 1 | 1

| 15 | 10/11/2014 | 2 | 1 | 4

| 16 | 10/12/2014 | 1 | NULL | NULL

| 17 | 10/16/2014 | NULL | 1 | NULL

| 18 | 10/14/2014 | NULL | NULL | NULL

| 18 | 10/17/2014 | NULL | 1 | NULL

| 19 | 10/15/2014 | NULL | NULL | 4

| 20 | 10/16/2014 | 1 | NULL | NULL

| 20 | 10/19/2014 | NULL | NULL | 1

2 个答案:

答案 0 :(得分:0)

您可以使用FULL OUTER JOINCOALESCENVL来确保IDDate列不为空。

SELECT  COALESCE(a.ID, b.ID,c.ID) AS ID,
        COALESCE(a."Date", b."Date", c."Date") AS "Date",
        a.Photo,
        b.Image,
        c.Cat
FROM    TableA a
        FULL OUTER JOIN
        TableB b
        ON ( a.ID = b.ID )
        FULL OUTER JOIN
        TableC c
        ON ( c.ID = COALESCE( a.ID, b.ID ) );

SQLFIDDLE

答案 1 :(得分:0)

你提到FULL JOIN所以我假设您使用支持它们的数据库。您可以使用COALESCE()返回已填充的IDDate,还可以简化JOIN条件:

SELECT COALESCE(a.ID,b.ID,c.ID) AS ID
      ,COALESCE(a.Date,b.Date,c.Date) AS Date 
      ,a.Photo
      ,b.Image
      ,c.Cat
FROM TableA a
FULL JOIN TableB b
  ON a.ID = b.ID  AND a.Date = b.Date
FULL JOIN TableC c
  ON COALESCE(a.ID,b.ID) = c.ID  AND COALESCE(a.Date,b.Date) = c.Date
相关问题