将附加列添加到 SQL UNION SELECT

Adding an additional column to SQL UNION SELECT

假设我有以下映射和规范化 tables;

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,用户和联系人是 "Account" 超类的子类。 (未显示)一个帐户可以属于多个组,因此 "BelongsTo" table 记录了帐户和组成员之间的 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 中断(因为列不匹配)。同样,我在组合子查询方面运气不佳。我可能遗漏了一些非常明显的东西......

提前致谢。

你可以 join 它到 group table 得到 name.

select x.*, g.name
from group g join
(
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"
) x on x.gid = g.gid
order by accid;