Я создал тестовые таблицы, выполнил ваши запросы и создал свои собственные. Мои выводы: Ваш первый запрос немного проблематичен c, ваш второй является верным, оба, возможно, немного изогнуты, но функциональны, и комментарии верны: где-то, так или иначе, ваши данные не соответствуют вашим ожиданиям.
Я настроил данные тестирования следующим образом, используя INT вместо даты и времени для ясности:
/*
DROP TABLE PrognosisA
DROP TABLE PrognosisB
DROP TABLE PrognosisC
*/
CREATE TABLE PrognosisA
(
Timestamp int not null primary key
,Value decimal(10,2) not null
,Country char(2) not null
)
CREATE TABLE PrognosisB
(
Timestamp int not null primary key
,Value decimal(10,2) not null
,Country char(2) not null
)
CREATE TABLE PrognosisC
(
Timestamp int not null primary key
,Value decimal(10,2) not null
,Country char(2) not null
)
Затем я настроил данные, которые охватывают все возможные комбинации «ID в одном, нескольких или все таблицы »:
INSERT PrognosisA (Timestamp, Value, Country) values
(1, 1.11, 'FR')
,(2, 2.21, 'FR')
,(3, 3.31, 'FR')
,(5, 5.51, 'FR')
INSERT PrognosisB (Timestamp, Value, Country) values
(1, 1.12, 'FR')
,(2, 2.22, 'FR')
,(4, 4.42, 'FR')
,(6, 6.62, 'FR')
INSERT PrognosisC (Timestamp, Value, Country) values
(1, 1.13, 'FR')
,(3, 3.33, 'FR')
,(4, 4.43, 'FR')
,(7, 7.73, 'FR')
После нескольких тупиков (полные внешние объединения всегда являются проблемой), я получил следующее:
SELECT
coalesce(pa.Timestamp, pb.Timestamp, pc.Timestamp) Timestamp
,pa.Timestamp
,pb.Timestamp
,pc.Timestamp
,pa.Value
,pb.Value
,pc.Value
from PrognosisA pa
full outer join PrognosisB pb
on pb.Timestamp = pa.Timestamp
full outer join PrognosisC pc
on pc.Timestamp = isnull(pa.Timestamp, pb.TimeStamp)
where coalesce(pa.Country, pb.Country, pc.Country) = 'FR'
order by 1 -- Only for testing!
Это возвращает все данные со всеми возможными перестановками присутствующих / не присутствующих и без повторяющихся строк.
Две рекомендации:
Просмотрите ваши данные Timstamp - и их типы данных - очень тщательно. Даты, особенно когда они равны go с точностью до Nths секунды, могут быть очень суетливыми для работы и не будут моим первым выбором для столбца соединения. Возможно, точность варьируется между таблицами и что-то усекается?
Данные, как описано, могут быть намного лучше нормализованы. Сделайте это одной таблицей, добавьте столбец для «WhichPrognosis» (A, B, C, что угодно) и go оттуда. Нужно вернуть один столбец «значение» для прогноза? Либо используйте сводную инструкцию (неудобно), либо позвольте вызывающему приложению разобраться с форматированием данных.