我有这样的疑问:
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个结果,这不是我想要的。
答案 0 :(得分:3)
然后逻辑上,您正在尝试查找重复的行。因此,GROUP BY
和HAVING
代替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 by
和count(*)
。您也可以获得重复的数量:
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;
. . .
用于额外的列,可帮助您诊断意外结果。