【发布时间】:2015-09-10 23:50:19
【问题描述】:
假设我有以下映射和规范化的表;
Group User Contact BelongsTo
+-------+------+------+ +-------+------+------+ +-------+------+------+ +-------+------+
| gID| name| col3| | uID| fname| sname| | cID| name| col3| | accID| gID|
+-------+------+------+ +-------+------+------+ +-------+------+------+ +-------+------+
|1 |ABC |? | |1 |JJ |BB | |4 |ABCD |? | |1 |2 |
+-------+------+------+ +-------+------+------+ +-------+------+------+ +-------+------+
|2 |BCD |? | |2 |CC |LL | |5 |BCDE |? | |3 |2 |
+-------+------+------+ +-------+------+------+ +-------+------+------+ +-------+------+
|3 |DEF |? | |3 |RR |NN | |6 |CDEF |? | |5 |3 |
+-------+------+------+ +-------+------+------+ +-------+------+------+ +-------+------+
使用 EERM,User 和 Contact 是“Account”超类的子类。 (未显示)一个帐户可以属于许多组,因此“BelongsTo”表记录了帐户和组成员之间的 M:N 关系。
我想要一条 SQL 语句,它允许我查询在组匹配条件中具有成员资格的所有用户和联系人,如下所示:
SELECT
tc."cID" AS "accID",
tc."name" AS "accName",
tbt."gID"
FROM "tblContact" tc
INNER JOIN "tblBelongsTo" tbt
ON tbt."accID" = tc."cID"
UNION SELECT
tu."uID" AS "accID",
CONCAT (tu."fname", ' ', tu."sname") AS "accName",
tbt."gID"
FROM "tblUser" tu
INNER JOIN "tblBelongsTo" tbt
ON tbt."accID" = tu."uID"
ORDER BY "accID" ASC;
以上工作,我在查询中结合了 UNION SELECT,因为当我将名字和姓氏连接在一起时,列数匹配任一侧。导致全局“account_name”和“account_id”列。
我的问题是:我将如何添加一个额外的列以便我可以看到组名是什么?
来自这个:
Result
+-------+-------+------+
| accID|accName| gID|
+-------+-------+------+
|1 |JJBB |2 |
+-------+-------+------+
|3 |RRNN |2 |
+-------+-------+------+
|5 |BCDE |3 |
+-------+-------+------+
到这里:
Result (2)
+-------+-------+------+------+
| accID|accName| gID| name|
+-------+-------+------+------+
|1 |JJBB |2 | BCD|
+-------+-------+------+------+
|3 |RRNN |2 | BCD|
+-------+-------+------+------+
|5 |BCDE |3 | DEF|
+-------+-------+------+------+
似乎我尝试过的所有操作都会导致 UNION SELECT 中断(因为列不匹配)。同样,我在组合子查询方面运气不佳。我可能遗漏了一些非常明显的东西......
提前致谢。
【问题讨论】:
标签: sql select inner-join union