我有多个表,比如A、B和C,其中B和C有A的外键。
我想编写一个查询,该查询将返回结果集,其中结果集的列是A、B和C的合并列,即
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中的一个。
这个是可能的吗?还是有更好的方式加入这些信息?
发布于 2014-04-09 19:44:37
由于您不希望单个行同时包含B和C,所以您可以将两个单独的连接查询放在一起,用NULL文本替换相反的表来使列对齐。UNION的每个部分都提供了A->B或A->C之间的关系,但必须为相对表的所有列返回NULL。提供一个NULL文本,使另一个表中的每个列都为空。
最后,您可以有条件地检查B列是否是NOT NULL,以强制B行在C行之前排序,这是在A.id首先排序之后。
(
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 ENDhttps://stackoverflow.com/questions/22972190
复制相似问题