【问题标题】:Adding an additional column to SQL UNION SELECT向 SQL UNION SELECT 添加附加列
【发布时间】: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


    【解决方案1】:

    您可以将join 发送到group 表以获取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;
    

    【讨论】:

    • 完美!谢谢你。 :)
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多