获取具有和不具有DISTINCT关键字的两个查询之间的行差异 - TSQL?

时间:2018-03-08 14:04:11

标签: sql sql-server sql-server-2008

我有这样的疑问:

SELECT DISTINCT

k.Key1, k.Key2, 
p.Key3, p.Key4, 
vp.Key5 

FROM [MY_DB].[dbo].[MY_TABLE_1] AS vp

INNER JOIN MY_DB.dbo.MY_TABLE_2 AS k 
ON vp.Code1 = k.Key1 AND vp.Code2 = k.Key3

INNER JOIN MY_DB.dbo.MY_TABLE_3 AS p 
ON p.Key3 = vp.Code3 

WHERE vp.Year = 2018

我希望在使用DISTINCT运行此查询时找到不同的行,而不使用它。当没有DISTINCT我得到,1875结果和DISTINCT我得到1656,结果有219个差异。

我不熟悉T-SQL。

有人可以给我一些想法如何让结果与众不同吗?

注意:我已经使用了GROUP BY:

GROUP BY k.Key1, k.Key2, k.Key3

但我只得到185个结果,这不是我想要的。

2 个答案:

答案 0 :(得分:3)

然后逻辑上,您正在尝试查找重复的行。因此,GROUP BYHAVING代替DISTINCT应该告诉您:

SELECT

k.Key1, k.Key2, 
p.Key3, p.Key4, 
vp.Key5 

FROM [MY_DB].[dbo].[MY_TABLE_1] AS vp

INNER JOIN MY_DB.dbo.MY_TABLE_2 AS k 
ON vp.Code1 = k.Key1 AND vp.Code2 = k.Key3

INNER JOIN MY_DB.dbo.MY_TABLE_3 AS p 
ON p.Key3 = vp.Code3 

WHERE vp.Year = 2018
GROUP BY
k.Key1, k.Key2, 
p.Key3, p.Key4, 
vp.Key5 
HAVING COUNT(*) > 1

答案 1 :(得分:2)

你想要group by。您获得不同计数的原因是您选择的列是重复的。

所以,group bycount(*)。您也可以获得重复的数量:

SELECT k.Key1, k.Key2, p.Key3, p.Key4, vp.Key5, count(*) as num_duplicates
FROM MY_DB.[dbo].[MY_TABLE_1] vp INNER JOIN
     MY_DB.dbo.MY_TABLE_2 k 
     ON vp.Code1 = k.Key1 AND vp.Code2 = k.Key3 INNER JOIN
     MY_DB.dbo.MY_TABLE_3 p 
     ON p.Key3 = vp.Code3 
WHERE vp.Year = 2018
GROUP BY k.Key1, k.Key2, p.Key3, p.Key4, vp.Key5
HAVING COUNT(*) > 1;

如果要选择更多列以获取有关重复项的更多信息,可以改为使用窗口函数:

SELECT *
FROM (SELECT k.Key1, k.Key2, p.Key3, p.Key4, vp.Key5, . . .,
             count(*) OVER (PARTITION BY k.Key1, k.Key2, p.Key3, p.Key4, vp.Key5) as num_duplicates
      FROM MY_DB.[dbo].[MY_TABLE_1] vp INNER JOIN
           MY_DB.dbo.MY_TABLE_2 k 
           ON vp.Code1 = k.Key1 AND vp.Code2 = k.Key3 INNER JOIN
           MY_DB.dbo.MY_TABLE_3 p 
           ON p.Key3 = vp.Code3 
      WHERE vp.Year = 2018
     ) x
WHERE num_duplicates > 1;

. . .用于额外的列,可帮助您诊断意外结果。