mysql - 对多个表执行 FULL OUTER JOIN 的替代方案?

标签 mysql sql full-outer-join

我需要在 MySQL 上运行以下命令,但它不允许完全外部连接:

SELECT COALESCE(t0.date, t1.date, t2.date, t3.date) AS date,
       COALESCE(t0.hits1, 0) AS hits0,
       COALESCE(t1.hits2, 0) AS hits1,
       COALESCE(t2.hits3, 0) AS hits2
       COALESCE(t3.hits3, 0) AS hits3
FROM t0
FULL OUTER JOIN t1 ON t0.date = t1.date
FULL OUTER JOIN t2 ON COALESCE(t0.date, t1.date) = t2.date;
FULL OUTER JOIN t3 ON COALESCE(t0.date, t1.date, t2.date) = t3.date;

如何在 MySQL 中做到这一点?

我了解如何对两个表执行此操作,例如,按照this example ,我可以这样做:

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL

而不是:

SELECT * FROM t1 FULL OUTER JOIN t2
ON t1.id = t2.id

但是我该如何做我的第一个例子呢?我提出的以下内容似乎是错误的:

SELECT COALESCE(t0.date, t1.date, t2.date, t3.date) AS date,
        COALESCE(t0.hits1, 0) AS hits0,
        COALESCE(t1.hits2, 0) AS hits1,
        COALESCE(t2.hits3, 0) AS hits2,
        COALESCE(t3.hits3, 0) AS hits3
FROM t0
LEFT JOIN t1 ON t0.date = t1.date
LEFT JOIN t2 ON COALESCE(t0.date, t1.date) = t2.date
LEFT JOIN t3 ON COALESCE(t0.date, t1.date, t2.date) = t3.date
UNION ALL
SELECT COALESCE(t0.date, t1.date, t2.date, t3.date) AS date,
        COALESCE(t0.hits1, 0) AS hits0,
        COALESCE(t1.hits2, 0) AS hits1,
        COALESCE(t2.hits3, 0) AS hits2,
        COALESCE(t3.hits3, 0) AS hits3
FROM t1
RIGHT JOIN t0 ON t0.date = t1.date
RIGHT JOIN t2 ON COALESCE(t0.date, t1.date) = t2.date
RIGHT JOIN t3 ON COALESCE(t0.date, t1.date, t2.date) = t3.date
WHERE t0.date IS NULL
AND t2.date IS NULL
AND t3.date IS NULL

因为下面的内容似乎限制太多:

WHERE t0.date IS NULL
AND t2.date IS NULL
AND t3.date IS NULL

最佳答案

您可以通过应用联合方法来完成这项工作,但对每个顺序交叉连接使用单独的 CTE:

WITH cte1 AS (
    SELECT t0.date AS date0, t1.date AS date1, t0.hits1, t1.hits2
    FROM t0
    LEFT JOIN t1 ON t1.date = t0.date
    UNION ALL
    SELECT t0.date, t1.date, t0.hits1, t1.hits2
    FROM t0
    RIGHT JOIN t1 ON t1.date = t0.date
    WHERE t0.date IS NULL
),
cte2 AS (
    SELECT t1.date0, t1.date1, t2.date AS date2,
           t1.hits1, t1.hits2, t2.hits3
    FROM cte1 t1
    LEFT JOIN t2 ON COALESCE(t1.date0, t1.date1) = t2.date
    UNION ALL
    SELECT t1.date0, t1.date1, t2.date, t1.hits1, t1.hits2, t2.hits3
    FROM cte1 t1
    RIGHT JOIN t2 ON COALESCE(t1.date0, t1.date1) = t2.date
    WHERE COALESCE(t1.date0, t1.date1) IS NULL
),
cte3 AS (
    SELECT t2.date0, t2.date1, t2.date2, t3.date AS date3,
           t2.hits1, t2.hits2, t2.hits3, t3.hits4
    FROM cte2 t2
    LEFT JOIN t3 ON COALESCE(t2.date0, t2.date1, t2.date2) = t3.date
    UNION ALL
    SELECT t2.date0, t2.date1, t2.date2, t3.date,
           t2.hits1, t2.hits2, t2.hits3, t3.hits4
    FROM cte2 t2
    RIGHT JOIN t3 ON COALESCE(t2.date0, t2.date1, t2.date2) = t3.date
    WHERE COALESCE(t2.date0, t2.date1, t2.date2) IS NULL
)

SELECT COALESCE(date0, date1, date2, date3) AS date,
       COALESCE(hits1, 0) AS hits0,
       COALESCE(hits2, 0) AS hits1,
       COALESCE(hits3, 0) AS hits2
       COALESCE(hits3, 0) AS hits3
FROM cte3;

关于mysql - 对多个表执行 FULL OUTER JOIN 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75977978/

相关文章:

mysql - 如何连接表以获得每一行源表的一行?

mysql - 完全外连接 - 如何完成我的查询

php - 根据 1 个变量从 2 个表中选择值。

php - 开发标签系统 - 如何用新标签更新现有标签?

MySQL 子查询返回多行并出错

mysql - 如何在同一查询中过滤的 SQL 中查找值

sql:创建调用函数的约束时出错

mysql - 如何在此查询中模拟完全外连接?

php - 如何使用 union all 仅回显一个参数

sql - 通过 View 或函数重用 sql