полный доступ к 3 таблицам - PullRequest
       26

полный доступ к 3 таблицам

0 голосов
/ 27 августа 2018

Я пытаюсь выполнить полное внешнее объединение с 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 ....), чтобы выбрать только одну дату.

Образец данных

Все остальные таблицы практически одинаковы, они содержат статистические данные для задач, выполненных в определенный день, каждая таблица для различных задач. Мне нужно отобразить все данные за один день от определенного пользователя («оператор»).

Я попробовал первый ответ, но у меня проблемы с представлением данных в хорошем виде.

Спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Сначала создайте список идентификаторов. Тогда используйте left join:

select . . . 
from (((select name, date from a
        union -- on purpose to remove duplicates
        select name, date from b
        union -- on purpose to remove duplicates
        select name, date from b
       ) nd left join
       a
       on a.name = nd.name and a.date = nd.date
      ) left join
      b
      on b.name = nd.name and b.date = nd.date
     ) left join
     c
     on c.name = nd.name and c.date = nd.date;
...