SQL Merge 3 таблицы по дате, когда некоторые даты отсутствуют - PullRequest
1 голос
/ 10 февраля 2012

У меня есть 3 таблицы, которые я хочу объединить, каждая из которых имеет свой интересующий столбец. У меня также есть переменная 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-даты или иногда без идентификатора.

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 10 февраля 2012

Соединения могут быть хитрыми вещами.Мой обычный подход - сначала сформировать набор ключей, а затем использовать эти ключи, чтобы получить то, что я хочу.

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
...