Сценарий: У меня есть 3 таблицы (высший, средний и нижний уровни). Каждый элемент в более высокой таблице может содержать несколько строк элементов в средней таблице. Нижняя таблица может содержать агрегированные значения, которые связаны с каждым элементом более высокой таблицы.
Логика c: цель состоит в агрегировании каждой строки из средней таблицы в верхнюю таблицу (полное объединение) и в эти строки агрегировать элементы нижней таблицы. Все три таблицы имеют общий столбец keyA.
+-----+------------+-------------+--------------+
| keyA | HigherName | HigherValue | HigherStatus |
+-----+------------+-------------+--------------+
| 123 | Item1 | 100 | Active |
+-----+------------+-------------+--------------+
| 124 | Item2 | 105 | Inactive |
+-----+------------+-------------+--------------+
| 125 | Item3 | 96 | Inactive |
+-----+------------+-------------+--------------+
| 126 | Item4 | 104 | Inactive |
+-----+------------+-------------+--------------+
| 127 | Item5 | 89 | Active |
+-----+------------+-------------+--------------+
| 128 | Item6 | 97 | Inactive |
+-----+------------+-------------+--------------+
EX Mid Table:
+-----+---------+----------+
| keyA | MidName | MidValue |
+-----+---------+----------+
| 123 | Mid1 | 55 |
+-----+---------+----------+
| 123 | Mid2 | 46 |
+-----+---------+----------+
| 123 | Mid3 | 49 |
+-----+---------+----------+
| 124 | Stat1 | 41 |
+-----+---------+----------+
| 124 | Stat2 | 59 |
+-----+---------+----------+
| 124 | Stat3 | 51 |
+-----+---------+----------+
| 125 | Gen1 | 56 |
+-----+---------+----------+
| 125 | Gen2 | 57 |
+-----+---------+----------+
| 126 | Test1 | 44 |
+-----+---------+----------+
| 127 | Lev1 | 42 |
+-----+---------+----------+
| 127 | Lev2 | 49 |
+-----+---------+----------+
| 127 | Lev3 | 50 |
+-----+---------+----------+
| 127 | Lev4 | 60 |
+-----+---------+----------+
| 128 | Spec1 | 61 |
+-----+---------+----------+
| 128 | Spec2 | 39 |
+-----+---------+----------+
EX Нижняя таблица:
+-----+-----------+------------+
| keyA | LowerName | LowerValue |
+-----+-----------+------------+
| 123 | Sub1 | 12 |
+-----+-----------+------------+
| 123 | Sub1 | 14 |
+-----+-----------+------------+
| 123 | Sub1 | 13 |
+-----+-----------+------------+
| 124 | Sub2 | 13 |
+-----+-----------+------------+
| 124 | Sub2 | 10 |
+-----+-----------+------------+
| 124 | Sub2 | 11 |
+-----+-----------+------------+
| 125 | Sub3 | 19 |
+-----+-----------+------------+
| 125 | Sub3 | 14 |
+-----+-----------+------------+
| 126 | Sub4 | 15 |
+-----+-----------+------------+
| 127 | Sub5 | 14 |
+-----+-----------+------------+
| 127 | Sub5 | 13 |
+-----+-----------+------------+
| 127 | Sub5 | 11 |
+-----+-----------+------------+
| 127 | Sub5 | 10 |
+-----+-----------+------------+
| 128 | Sub6 | 11 |
+-----+-----------+------------+
| 128 | Sub6 | 12 |
+-----+-----------+------------+
Вывод EX:
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| keyA | HigherName | HigherValue | HigherStatus | MidName | MidValue | LowerName | LowerValue |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 123 | Item1 | 100 | Active | Mid1 | 55 | Sub1 | 12 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 123 | Item1 | 100 | Active | Mid2 | 46 | Sub1 | 14 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 123 | Item1 | 100 | Active | Mid3 | 49 | Sub1 | 13 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 124 | Item2 | 105 | Inactive | Stat1 | 41 | Sub2 | 13 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 124 | Item2 | 105 | Inactive | Stat2 | 59 | Sub2 | 10 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 124 | Item2 | 105 | Inactive | Stat3 | 51 | Sub2 | 11 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 125 | Item3 | 96 | Inactive | Gen1 | 56 | Sub3 | 19 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 125 | Item3 | 96 | Inactive | Gen2 | 57 | Sub3 | 14 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 126 | Item4 | 104 | Inactive | Test1 | 44 | Sub4 | 15 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 127 | Item5 | 89 | Active | Lev1 | 42 | Sub5 | 14 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 127 | Item5 | 89 | Active | Lev2 | 49 | Sub5 | 13 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 127 | Item5 | 89 | Active | Lev3 | 50 | Sub5 | 11 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 127 | Item5 | 89 | Active | Lev4 | 60 | Sub5 | 10 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 128 | Item6 | 97 | Inactive | Spec1 | 61 | Sub6 | 11 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
| 128 | Item6 | 97 | Inactive | Spec2 | 39 | Sub6 | 12 |
+-----+------------+-------------+--------------+---------+----------+-----------+------------+
Что я сделал: Я пытался использовать полное объединение для объединения таблиц. При использовании полного соединения между высшим и средним все работало нормально. Но когда я пытаюсь включить Lower, я получаю ошибку:
'databaseA.higher.keyA' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Вопрос: Что я делаю не так и как это исправить?
Код до сих пор:
Select
[keyA ] = databaseA.higher.keyA,
[Higher Name ] = databaseA.higher.higher_name,
[Higher Value ] = databaseA.higher.higher_value,
[Higher Status ] = databaseA.higher.higher_status,
[Mid Name ] = databaseA.mid.mid_status,
[Mid Value ] = databaseA.mid.mid_value,
[Lower Name ] = databaseA.lowerA.LowerA_status,
[Lower Value ] = databaseA.lowerA.lowerA_value
from databaseA.higher
FULL JOIN databaseA.mid
on databaseA.higher.keyA = databaseA.mid.keyA
Full JOIN databaseA.lower
on databaseA.higher.keyA = databaseA.lower.keyA
where databaseA.higher.keyA in ('82487')