Так как мне не удается получить результат с ответом Гордона Линоффа, я попробовал другой способ с 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 пусто).
Я предполагаю, что это может быть обновлено, но на данный момент это решает мою проблему и позволяет мне добавлять столько таблиц, сколько мне нужно.