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 的所有内容,如果 tab2tab3 中没有匹配项,那么它会将字段显示为空。 ..

| t1.ids | t1.name | t2.ids | t3.ids |
| 1      | n1      | null   | 1      |
| 2      | n2      | 2      | null   |

我需要的是,如果 tab1tab2tab3 中的某些内容不匹配,仍然 return tab2tab3 行,但 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;