首页 > 解决方案 > 如何在连接多个表的查询中避免 DISTINCT?

问题描述

我想避免使用 DISTINCT 并为连接多个表的查询产生相同的结果。如果没有 DISTINCT,它会多次生成同一行。

我已经尝试查找如何避免 DISTINCT,但似乎没有什么对我有用,似乎是因为我的表更复杂并且同时连接多个表。

SELECT DISTINCT C.COL3, B.COL1, A.COL2, A.COL4, B.COL5 FROM C
INNER JOIN B
ON B.COL1 = C.COL1 
INNER JOIN A
ON B.COL2 = A.COL2
ORDER BY C.COL3 ASC;

我知道我必须以GROUP BY某种方式使用,但我就是无法绕过它......

标签: sqloraclegroup-bydistinct

解决方案


您可以按所有列分组(没有聚合):

SELECT
   C.COL3, B.COL1, A.COL2, A.COL4, B.COL5
FROM C
JOIN B ON B.COL1 = C.COL1 
JOIN A ON B.COL2 = A.COL2
GROUP BY C.COL3, B.COL1, A.COL2, A.COL4, B.COL5 -- group by all selected columns
ORDER BY C.COL3 ASC

如果您想要聚合上述查询的重复数据行,请将其用作子查询。例如,去SUM(B.COL5)重复行:

SELECT
    COL3, COL1, COL2, COL4, SUM(COL5)
FROM (
    SELECT
       C.COL3, B.COL1, A.COL2, A.COL4, B.COL5
    FROM C
    JOIN B ON B.COL1 = C.COL1 
    JOIN A ON B.COL2 = A.COL2
    GROUP BY C.COL3, B.COL1, A.COL2, A.COL4, B.COL5
) deduped
GROUP BY COL3, COL1, COL2, COL4
ORDER BY COL3 ASC

推荐阅读