我需要在 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/