如何在连接多个表的查询中避免 DISTINCT?

How to avoid DISTINCT in a query that joins multiple tables?

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

我已经尝试查找如何避免 DISTINCT,但似乎对我没有任何作用,似乎是因为我的 table 更复杂并且同时加入多个 table。

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,但我就是无法理解它...

如果不使用 DISTINCT,是否会得到相同数据的多个重复行?如果是这样,当我加入多个 asp 网络表以显示用户信息以及他们分配到的站点内的角色时,此查询对我有用。希望对您有所帮助。

SELECT AspNetUsers.Id, AspNetRoles.Name as SiteRole,
AspNetRoles.ID as RoleID, AspNetUsers.UserName, 
AspNetUsers.Email FROM AspNetUserRoles INNER JOIN
AspNetUsers ON AspNetUserRoles.UserId = AspNetUsers.Id INNER JOIN
AspNetRoles ON AspNetUserRoles.RoleId = AspNetRoles.Id

您可以使用 row_number() 按 [您想要区分的列] 进行分区。

select * 
    from (select c.col3, b.col1, a.col2, a.col4, b.col5
        , row_number() over (partition by c.col1 order by c.col3) as rn
    from c
    inner join b on b.col1 = c.col1
    inner join a on a.col2 = b.col2) t1
where t1.rn = 1
order by t1.col3

您可以只按所有列分组(无需聚合):

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
SELECT COL3, COL1, SUM(COL5)
FROM
(
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
) X
GROUP BY COL3, COL1
ORDER BY COL3, COL1