return 左表的所有结果以及右表的所有结果(如果左侧存在某些内容)
return all results from left tables along with right if something exists on left
抱歉,如果描述不正确,我不是专家 SQL...
我有以下查询 -
SELECT t1.ids, t1.name, t2.ids t3.ids FROM tab1 t1
LEFT JOIN tab2 t2 on t2.ids = t1.ids
LEFT JOIN tab3 t3 on t3.ids = t1.ids
此查询的结果是 return 来自 tab1
的所有内容,如果 tab2
或 tab3
中没有匹配项,那么它会将字段显示为空。 ..
| t1.ids | t1.name | t2.ids | t3.ids |
| 1 | n1 | null | 1 |
| 2 | n2 | 2 | null |
我需要的是,如果 tab1
与 tab2
或 tab3
中的某些内容不匹配,仍然 return tab2
和 tab3
行,但 tab1
字段为空,所以像这样:
| t1.ids | t1.name | t2.ids | t3.ids |
| 1 | n1 | null | 1 |
| null | null | 1 | null |
知道完成此任务的最有效方法是什么吗?
您想要的是 FULL OUTER JOIN
,遗憾的是 MySQL 中没有。在这种情况下,您可以使用 UNION ALL
:
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM tab1 t1
LEFT JOIN tab2 t2 on t2.ids = t1.ids
LEFT JOIN tab3 t3 on t3.ids = t1.ids
UNION ALL
-- Get all t2 rows having no match in t1
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM tab2 t2
LEFT JOIN tab1 t1 on t2.ids = t1.ids
LEFT JOIN tab3 t3 on t3.ids = t2.ids
WHERE t1.id IS NULL
UNION ALL
-- Get all rows in t3 having no match in t1 AND no match
-- in t2. Rows of t3 having no match in t1 and a match in t2
-- are returned by th previous query.
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM tab3 t3
LEFT JOIN tab1 t1 on t3.ids = t1.ids
LEFT JOIN tab2 t2 on t2.ids = t3.ids
WHERE t1.id IS NULL AND t2.id IS NULL
您正在寻找 MySQL 不支持的完整外部联接。最简单的方法是,首先 select 所有 ID,然后外连接所有表:
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM (SELECT ids FROM tab1 UNION SELECT ids FROM tab2 UNION SELECT ids FROM tab3) x
LEFT JOIN tab1 t1 on t1.ids = x.ids
LEFT JOIN tab2 t2 on t2.ids = x.ids
LEFT JOIN tab3 t3 on t3.ids = x.ids;
抱歉,如果描述不正确,我不是专家 SQL...
我有以下查询 -
SELECT t1.ids, t1.name, t2.ids t3.ids FROM tab1 t1
LEFT JOIN tab2 t2 on t2.ids = t1.ids
LEFT JOIN tab3 t3 on t3.ids = t1.ids
此查询的结果是 return 来自 tab1
的所有内容,如果 tab2
或 tab3
中没有匹配项,那么它会将字段显示为空。 ..
| t1.ids | t1.name | t2.ids | t3.ids |
| 1 | n1 | null | 1 |
| 2 | n2 | 2 | null |
我需要的是,如果 tab1
与 tab2
或 tab3
中的某些内容不匹配,仍然 return tab2
和 tab3
行,但 tab1
字段为空,所以像这样:
| t1.ids | t1.name | t2.ids | t3.ids |
| 1 | n1 | null | 1 |
| null | null | 1 | null |
知道完成此任务的最有效方法是什么吗?
您想要的是 FULL OUTER JOIN
,遗憾的是 MySQL 中没有。在这种情况下,您可以使用 UNION ALL
:
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM tab1 t1
LEFT JOIN tab2 t2 on t2.ids = t1.ids
LEFT JOIN tab3 t3 on t3.ids = t1.ids
UNION ALL
-- Get all t2 rows having no match in t1
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM tab2 t2
LEFT JOIN tab1 t1 on t2.ids = t1.ids
LEFT JOIN tab3 t3 on t3.ids = t2.ids
WHERE t1.id IS NULL
UNION ALL
-- Get all rows in t3 having no match in t1 AND no match
-- in t2. Rows of t3 having no match in t1 and a match in t2
-- are returned by th previous query.
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM tab3 t3
LEFT JOIN tab1 t1 on t3.ids = t1.ids
LEFT JOIN tab2 t2 on t2.ids = t3.ids
WHERE t1.id IS NULL AND t2.id IS NULL
您正在寻找 MySQL 不支持的完整外部联接。最简单的方法是,首先 select 所有 ID,然后外连接所有表:
SELECT t1.ids, t1.name, t2.ids t3.ids
FROM (SELECT ids FROM tab1 UNION SELECT ids FROM tab2 UNION SELECT ids FROM tab3) x
LEFT JOIN tab1 t1 on t1.ids = x.ids
LEFT JOIN tab2 t2 on t2.ids = x.ids
LEFT JOIN tab3 t3 on t3.ids = x.ids;