首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:将多个不同的表合并为一个

问MySQL:将多个不同的表合并为一个
EN

Stack Overflow用户
提问于 2014-04-09 19:27:30
回答 1查看 249关注 0票数 2

我有多个表,比如A、B和C,其中B和C有A的外键。

我想编写一个查询,该查询将返回结果集,其中结果集的列是A、B和C的合并列,即

代码语言:javascript
复制
A.id A.name B.id B.name C.id C.name
-----------------------------------
1    Thing  2    Bee    NULL NULL
1    Thing  NULL NULL   1    Cow

也就是说,从本质上说,B和C上的单个左外部联接的结果组合在一起,但合并成一个结果集。我同意存在多个空列。

编辑:结果集总是有A的条目,但只有B或C中的一个。

这个是可能的吗?还是有更好的方式加入这些信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-09 19:44:37

由于您不希望单个行同时包含B和C,所以您可以将两个单独的连接查询放在一起,用NULL文本替换相反的表来使列对齐。UNION的每个部分都提供了A->B或A->C之间的关系,但必须为相对表的所有列返回NULL。提供一个NULL文本,使另一个表中的每个列都为空。

最后,您可以有条件地检查B列是否是NOT NULL,以强制B行在C行之前排序,这是在A.id首先排序之后。

代码语言:javascript
复制
(
  SELECT 
    A.id AS a_id,
    A.name AS a_name,
    B.id AS b_id,
    B.name AS b_name,
    /* Substitute NULLs... for the other table C, for *all columns* */
    NULL AS c_id,
    NULL AS c_name,
    NULL AS other_c
    /* etc, other cols from C */
  FROM A
    LEFT JOIN B ON A.id = B.a_id
/* UNION, rather than UNION ALL  in case both tables have NULLs */
) UNION (
  SELECT
    A.id AS a_id,
    A.name AS a_name,
    /* This time substitute NULLs for B, again *all columns* */
    NULL AS b_id,
    NULL AS b_name,
    C.id AS c_id,
    C.name AS c_name
    C.other_c
  FROM A
    LEFT JOIN C ON A.id = C.a_id
)
ORDER BY 
  a_id,
  /* sort the non-null B ahead... */
  CASE WHEN b_id IS NOT NULL THEN 0 ELSE 1 END
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22972190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档