SQL按日期合并3个表,其中缺少某些日期

时间:2012-02-10 19:08:50

标签: sql outer-join

我想要合并3个表,每个表都有不同的感兴趣的列。我还有一个id变量,我想在“id”内单独合并。我的想法是,我希望按日期(在ID内)合并X,Y和Z,并且如果特定变量不存在该日期,则会丢失值。

Table X:
ID     Date         X
1      2012-01-01   101
1      2012-01-02   102
1      2012-01-03   103
1      2012-01-04   104
1      2012-01-05   105
2      2012-01-01   150

Table Y:
ID     Date         Y
1      2012-01-01   301
1      2012-01-02   302
1      2012-01-03   303
1      2012-01-11   311
2      2012-01-01   350

Table Z:
ID     Date         Z
1      2012-01-01   401
1      2012-01-03   403
1      2012-01-04   404
1      2012-01-11   411
1      2012-01-21   421
2      2012-01-01   450

Desired Result Table:
ID     Date         X     Y     Z
1      2012-01-01   101   301   401
1      2012-01-02   102   302   .
1      2012-01-03   103   303   403
1      2012-01-04   104   .     404
1      2012-01-05   105   .     .
1      2012-01-11   .     311   411
1      2012-01-21   .     .     421
2      2012-01-01   150   350   450

任何想法如何编写此SQL语句?我已经尝试过使用“完全连接”以及交叉产品的语句,但我一直在为某些ID日期组合获取重复值,或者有时没有ID。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

加入可能是棘手的事情。我通常的方法是首先形成一组键,然后使用这些键来获得我想要的东西。

SELECT source.ID, source.Date, x.X, y.Y, z.Z
FROM
(
  SELECT ID, Date
  FROM TableX
  UNION
  SELECT ID, Date
  FROM TableY
  UNION
  SELECT ID, Date
  FROM TableZ
) as source
LEFT JOIN TableX x ON source.ID = x.ID AND source.Date = x.Date
LEFT JOIN TableY y ON source.ID = y.ID AND source.Date = y.Date
LEFT JOIN TableZ z ON source.ID = z.ID AND source.Date = z.Date
ORDER BY source.ID, source.Date