四張表 A、B、C、D,需單條 SQL 實現:
a, b)a 關聯聚合 COUNT(*)D.aa b count D.a
1 1 3 1
2 2 1 2
3 4 0 3
4 6 0 4
WITH
A AS (
SELECT 1 AS a, 1 AS b UNION ALL
SELECT 2, 2 UNION ALL
SELECT 3, 4 UNION ALL
SELECT 4, 6
),
B_agg AS (
SELECT a, COUNT(*) AS cnt
FROM (
SELECT 1 AS a, 3 AS c UNION ALL
SELECT 1, 3 UNION ALL
SELECT 1, 3 UNION ALL
SELECT 2, 3
) B
GROUP BY a
),
C AS (
SELECT 1 AS a, 'A' AS d UNION ALL
SELECT 2, 'B' UNION ALL
SELECT 3, 'C' UNION ALL
SELECT 4, 'D'
),
D AS (
SELECT 1 AS a, 'A' AS d UNION ALL
SELECT 2, 'B' UNION ALL
SELECT 3, 'C' UNION ALL
SELECT 4, 'D'
)
SELECT
A.a,
A.b,
IFNULL(B_agg.cnt, 0) AS c,
D.a
FROM A
LEFT JOIN B_agg ON A.a = B_agg.a
JOIN C ON A.a = C.a
JOIN D ON C.d = D.d;
IFNULL 補 0。C.d = D.d 確保關聯正確。B_agg 先聚合再關聯,避免重複計算。SELECT
A.a, A.b, IFNULL(B_agg.cnt, 0) AS c, D.a
FROM (
SELECT 1 AS a, 1 AS b UNION ALL SELECT 2,2 UNION ALL SELECT 3,4 UNION ALL SELECT 4,6
) A
LEFT JOIN (
SELECT a, COUNT(*) AS cnt FROM (
SELECT 1 AS a UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 2
) B GROUP BY a
) B_agg ON A.a = B_agg.a
JOIN (
SELECT 1 AS a, 'A' AS d UNION ALL SELECT 2,'B' UNION ALL SELECT 3,'C' UNION ALL SELECT 4,'D'
) C ON A.a = C.a
JOIN (
SELECT 1 AS a, 'A' AS d UNION ALL SELECT 2,'B' UNION ALL SELECT 3,'C' UNION ALL SELECT 4,'D'
) D ON C.d = D.d;
A.a、B.a、C.a、C.d、D.d)。