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

时间:2019-11-28 23:43:05

标签: sql oracle group-by 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,但我只是无法将其包裹住...

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以按[您要区分的列]使用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

答案 2 :(得分:0)

您可以按所有列进行分组(不进行ay聚合):

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

答案 3 :(得分:0)

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