【发布时间】:2020-01-17 14:59:18
【问题描述】:
场景:我有 3 张桌子(高级、中级和低级)。 Higher 表中的每个项目都可以包含中间表中的多行项目。下层表可以包含聚合值,这些值连接到上层表的每个项目。
逻辑:目的是将中间表的每一行聚合到上层表中(全连接),然后对这些行聚合下层表的项目。所有三个表共享 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 中桌:
+-----+---------+----------+
| 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')
【问题讨论】:
-
请说明合并表格的逻辑,并添加数据库标签。
-
该查询包含多个错误。而且还是不能给出描述的错误信息。
-
FULL JOIN databaseA.mid on databaseA.higher.keyA = databaseA.higher.keyA.keyA INNER JOIN databaseA.mid on databaseA.higher.keyA = databaseA.mid.keyA您将加入mid表2 次。FULL JOIN仅使用higher.keyA。我认为这是错误的databaseA.higher.keyA.keyA。请帮助我们进一步了解。 -
@GordonLinoff 添加到问题中。逻辑基本上是基于keyA的三个表的全连接。
-
@jarlh 修正了 OP 中的一些错误。