Я пытаюсь выполнить полное внешнее объединение с 3 таблицами в MS-доступе, но проблема в том, что доступ не поддерживает его.
Я пытался сделать это с 3 левыми соединениями, но в некоторых случаях я получаю дублированные результаты.
Я пытаюсь объединить данные, где имя и дата одинаковы во всех 3 таблицах,
мой запрос выглядит примерно так:
SELECT
a.date, a.name, a.whatewer,
b.date, b.name, b.whatewer,
c.date, c.name, c.whatewer
FROM (a LEFT JOIN b ON a.date = b.date AND a.name = b.name)
LEFT JOIN c ON c.date = a.date AND c.name = a.name
UNION
SELECT
a.date, a.name, a.whatewer,
b.date, b.name, b.whatewer,
c.date, c.name, c.whatewer
FROM (b LEFT JOIN a ON a.date = b.date AND a.name = b.name)
LEFT JOIN c ON c.date = a.date AND c.name = a.name
SELECT
a.date, a.name, a.whatewer,
b.date, b.name, b.whatewer,
c.date, c.name, c.whatewer
FROM (c LEFT JOIN a ON a.date = c.date AND a.name = c.name)
LEFT JOIN b ON c.date = b.date AND c.name = b.name
Результат, который я получаю, в основном правильный, но я получаю дублированные результаты, когда есть данные в таблицах b и c, но не в a.
Вместо того, чтобы объединяться под одним именем и датой, в результате я получаю одну строку с данными из таблицы b, а затем еще одну с объединенными данными из b и c, как и должно быть.
Как получить из этих ненужных результатов?
Спасибо!
EDIT:
Полный код (имена не на английском языке, я надеюсь, что вы все равно сможете понять достаточно):
SELECT
Nz (Nz (zajem.Datum, ak.Datum ), nk.Datum ) AS Datum,
Nz (Nz (zajem.Operater, ak.Operater ), nk.Operater ) AS Operater,
zajem.Skupni_cas_zajema AS [Skupni cas zajema (min)],
zajem.Povprecni_cas_zajema_na_PZ AS [Povprecni cas zajema na PZ (min)],
zajem.Stevilo_PZ AS [Stevilo zajetih PZ],
zajem.Stevilo_poligonov AS [Stevilo poligonov],
ak.Skupni_cas_zajema AS [Skupni cas AK (min)],
ak.Povprecni_cas_zajema_na_PZ AS [Povprecni cas AK na PZ],
ak.Stevilo_PZ AS [Stevilo PZ (AK)],
ak.Stevilo_poligonov AS [Stevilo poligonov (AK)],
nk.Skupni_cas_zajema AS [Skupni cas NK (min)],
nk.Povprecni_cas_zajema_na_PZ AS [Povprecni cas NK na PZ],
nk.Stevilo_PZ AS [Stevilo PZ (NK)],
nk.Stevilo_poligonov AS [Stevilo poligonov (NK)]
FROM
(tabela_ves_zajem AS zajem LEFT OUTER JOIN tabela_vse_ak AS ak ON zajem.datum = ak.datum AND zajem.operater = ak.operater) LEFT OUTER JOIN tabela_vse_nk as nk ON nk.datum = zajem.datum AND nk.operater = zajem.operater
UNION
SELECT
Nz (Nz (zajem.Datum, ak.Datum ), nk.Datum ) AS Datum,
Nz (Nz (zajem.Operater, ak.Operater ), nk.Operater ) AS Operater,
zajem.Skupni_cas_zajema AS [Skupni cas zajema (min)],
zajem.Povprecni_cas_zajema_na_PZ AS [Povprecni cas zajema na PZ (min)],
zajem.Stevilo_PZ AS [Stevilo zajetih PZ],
zajem.Stevilo_poligonov AS [Stevilo poligonov],
ak.Skupni_cas_zajema AS [Skupni cas AK (min)],
ak.Povprecni_cas_zajema_na_PZ AS [Povprecni cas AK na PZ],
ak.Stevilo_PZ AS [Stevilo PZ (AK)],
ak.Stevilo_poligonov AS [Stevilo poligonov (AK)],
nk.Skupni_cas_zajema AS [Skupni cas NK (min)],
nk.Povprecni_cas_zajema_na_PZ AS [Povprecni cas NK na PZ],
nk.Stevilo_PZ AS [Stevilo PZ (NK)],
nk.Stevilo_poligonov AS [Stevilo poligonov (NK)]
FROM
(tabela_vse_ak AS ak LEFT OUTER JOIN tabela_ves_zajem AS zajem ON zajem.datum = ak.datum AND zajem.operater = ak.operater) LEFT OUTER JOIN tabela_vse_nk as nk ON nk.datum = zajem.datum AND nk.operater = zajem.operater
UNION
SELECT
Nz (Nz (zajem.Datum, ak.Datum ), nk.Datum ) AS Datum,
Nz (Nz (zajem.Operater, ak.Operater ), nk.Operater ) AS Operater,
zajem.Skupni_cas_zajema AS [Skupni cas zajema (min)],
zajem.Povprecni_cas_zajema_na_PZ AS [Povprecni cas zajema na PZ (min)],
zajem.Stevilo_PZ AS [Stevilo zajetih PZ],
zajem.Stevilo_poligonov AS [Stevilo poligonov],
ak.Skupni_cas_zajema AS [Skupni cas AK (min)],
ak.Povprecni_cas_zajema_na_PZ AS [Povprecni cas AK na PZ],
ak.Stevilo_PZ AS [Stevilo PZ (AK)],
ak.Stevilo_poligonov AS [Stevilo poligonov (AK)],
nk.Skupni_cas_zajema AS [Skupni cas NK (min)],
nk.Povprecni_cas_zajema_na_PZ AS [Povprecni cas NK na PZ],
nk.Stevilo_PZ AS [Stevilo PZ (NK)],
nk.Stevilo_poligonov AS [Stevilo poligonov (NK)]
FROM
(tabela_vse_nk AS nk LEFT OUTER JOIN tabela_ves_zajem AS zajem ON zajem.datum = nk.datum AND zajem.operater = nk.operater) LEFT OUTER JOIN tabela_vse_ak as ak ON nk.datum = ak.datum AND nk.operater = ak.operater;
Я использую nz (nz (zajem.datum ....), чтобы выбрать только одну дату.
Образец данных
Все остальные таблицы практически одинаковы, они содержат статистические данные для задач, выполненных в определенный день, каждая таблица для различных задач. Мне нужно отобразить все данные за один день от определенного пользователя («оператор»).
Я попробовал первый ответ, но у меня проблемы с представлением данных в хорошем виде.
Спасибо.