Внутреннее соединение с графом, несколько таблиц - PullRequest
0 голосов
/ 06 марта 2020

У меня проблема с MS Access, чтобы получить правильные значения для нескольких таблиц. Я вовсе не эксперт в SQL запросах.

У меня есть набор таблиц, который структурирован следующим образом:

  • Table1: UID, Имя, другая информация
  • Таблица 2: UID, FK_UID_Table1, Имя, другая информация
  • Таблица 3: UID, FK_UID_Table2, Имя, другая информация
  • Таблица 4: UID, FK_UID_Table3, Имя, другая информация

Каждая ссылка на FK равна 1-N, причем N> = 0. Таким образом, возможно, что элемент в Таблице 2 не имеет ссылки на Table3 FK.

То, чего я пытаюсь достичь, это чтобы получить количество каждого элемента в одном запросе.

Например, если я выберу элемент в Таблице 1, я бы хотел получить:

Table1.Name | Count(Table2.UID) | Count(Table3.UID) | Count(Table4.UID)

Мне удалось получить точное количество с одним INNER JOIN следующим образом:

SELECT g.UID, Table1.Name, COUNT(s.UID) AS CountTable2
FROM Table1 AS g INNER JOIN Table2 AS s ON s.FK_Table1 = g.UID
GROUP BY g.UID, g.Name

Например, с элементом в Table1, который получает 2 ссылки в Table2 и 3 ссылки в Table3, в результате я получаю 2, что является правильным.

Когда я пытаюсь добавить другой слой подсчета, я сделал следующее:

SELECT g.UID, g.Name, COUNT(s.UID) AS CountTable2, COUNT(p.UID) AS CountTable3
FROM (Table1 as g
INNER JOIN Table2 AS s ON s.FK_Table1 = g.UID)
INNER JOIN Table3 AS p ON p.FK_Table2 = s.UID
GROUP BY g.UID, g.Name, CountTable2, CountTable3

В моем предыдущем примере вместо 2 для CountTable2 и 3 для CountTable3 в результате я получаю 3 и 3.

Я прочитал, что это ожидаемое поведение с Access, но я не не могу найти способ заставить его работать.

Мне помог этот вопрос: Внутреннее объединение со счетом на три таблицы

Любая помощь будет с благодарностью.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Так как мне не удается получить результат с ответом Гордона Линоффа, я попробовал другой способ с LEFT OUTER JOIN.

Благодаря этому сообщению: Как получить группу, в которой счет равно нулю

Мне удалось получить правильный результат с пустыми отношениями (например, элемент Table2 не имеет ссылки в Table3), но теперь я получил неправильный результат, когда присоединяюсь к более чем двум таблицам.

Я полагаю, это проблема из моего запроса ...

В настоящее время:

SELECT Table1.UID, Table1.Name
COUNT(Table2.UID) AS CountTable2
FROM Table1
LEFT OUTER JOIN Table2 ON Table2.FK_Table1 = Table1.UID
GROUP BY Table1.UID, Table1.Name

дает мне правильный результат (только две таблицы связаны), но:

SELECT Table1.UID, Table1.Name
COUNT(Table2.UID) AS CountTable2, COUNT(Table3.UID) AS CountTable3
FROM (Table1
LEFT OUTER JOIN Table2 ON Table2.FK_Table1 = Table1.UID)
LEFT OUTER JOIN Table3 ON Table3.FK_Table2 = Table2.UID
GROUP BY Table1.UID, Table1.Name

дает мне неправильный результат для CountTable2, который, кажется, больше, чем ожидалось. CountTable3 является правильным.

РЕДАКТИРОВАТЬ:

Я наконец-то понял, как заставить это работать, в соответствии с моими исследованиями и подсказкой Гордона Линоффа с агрегацией до присоединения.

Я начинаю с подсчета самой глубокой таблицы в таблице выше, затем присоединяюсь и так далее. На каждом шаге я выбираю основную информацию, которую нужно сохранить: UID, FK_AboveTable, Count, Sums from самой глубокой таблице.

Окончательный код:

SELECT Table1.UID, Table1.Name, COUNT(Table2.UID) AS TotalTable2, SUM(CountTable3) AS TotalTable3, SUM(CountTable4_2) AS TotalTable4
FROM Table1 LEFT OUTER JOIN (
    SELECT Table2.UID, Table2.FK_Table1, COUNT(Table3.UID) AS CountTable3, 
    SUM(CountTable4) AS CountTable4_2
    FROM Table2 LEFT OUTER JOIN (
        SELECT Table3.UID, Table3.FK_Table1, COUNT(Table4.UID) AS CountTable4
        FROM Port LEFT OUTER JOIN
            Table4 ON Table4.FK_Table3 = Table3.UID
            GROUP BY Table3.UID, Table3.FK_Table2
        ) Table3 ON Table3.FK_Table2 = Table2.UID
        GROUP BY Table2.UID, Table2.FK_Table1
    ) Table2 ON Table2.FK_Table1= Table1.UID
GROUP BY Table1.UID, Table1.Name ORDER BY Table1.Name DESC

Обратите внимание, что отображается количество пустостей из самой глубокой таблицы: void и no 0 (например, если в Таблице 1 есть один элемент, в Таблице 2 нет ни одного, для Table2 счет будет равен 0, для Table3 и Table4 пусто).

Я предполагаю, что это может быть обновлено, но на данный момент это решает мою проблему и позволяет мне добавлять столько таблиц, сколько мне нужно.

0 голосов
/ 06 марта 2020

Совокупность до присоединения:

SELECT g.UID, g.Name, s.CountTable2, p.CountTable3
FROM (Table1 g LEFT JOIN
      (SELECT s.FK_Table1, COUNT(*) as CountTable2
       FROM Table2
       GROUP BY s.FK_Table1
      ) AS s
      ON s.FK_Table1 = g.UID
     ) LEFT JOIN
     (SELECT s.FK_Table1, COUNT(*) as CountTable3
      FROM Table3 as p JOIN
           Table2 as s
           ON p.FK_Table2 = s.UID
      GROUP BY s.FK_Table1
     ) as p
     ON p.FK_Table1 = g.UID;
...