Tsql DISTINCT仍然在结果中为我提供dups记录
我的每个部分都得到了双重结果…所以我显然没有在这里使用Distinct,或者需要使用分组 例如:Tsql DISTINCT仍然在结果中为我提供dups记录,tsql,Tsql,我的每个部分都得到了双重结果…所以我显然没有在这里使用Distinct,或者需要使用分组 例如: select DISTINCT p.PartNum, p.PartID, pn.Name, d.[Description], n.Note as PartNote from Part p join PartName pn on pn.PartName
select DISTINCT p.PartNum,
p.PartID,
pn.Name,
d.[Description],
n.Note as PartNote
from Part p
join PartName pn on pn.PartNameID = p.PartNameID
join ApplicationPaint ap on ap.partID = p.PartID
join [Application] a on a.ApplicationID = ap.ApplicationID
join [Description] d on d.DescriptionID = ap.DescriptionID
join Note n on n.NoteID = a.NoteID
join MYConfig mmy on mmy.MMYConfigID = a.MYConfigID
join Model mo on mo.ModelID = mmy.ModelID
where mmy.ModelId = 2673
and substring(n.Note, CHARINDEX(']', n.Note) + 2, LEN(n.Note))= 'Johnson'
结果:
T50015 765963 Some Part Name SomeNoteA [342] Johnson
T50015 765963 Some Part Name SomeNoteA [343] Johnson
T60024 766068 Some Part Name SomeNoteB [342] Johnson
T60024 766068 Some Part Name SomeNoteB [343] Johnson
T60231 766093 Some Part Name SomeNoteA [342] Johnson
T60231 766093 Some Part Name SomeNoteA [343] Johnson
T60232 766094 Some Part Name SomeNoteA [342] Johnson
T60232 766094 Some Part Name SomeNoteA [343] Johnson
T70134 766150 Some Part Name SomeNoteA [342] Johnson
T70134 766150 Some Part Name SomeNoteA [343] Johnson
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [343] Johnson
Y50078 766253 Some Part Name SomeNoteH [342] Johnson
N30026 766352 Some Part Name SomeNoteT [342] Johnson
N30026 766352 Some Part Name SomeNoteT [343] Johnson
N50041 766465 Some Part Name SomeNoteK [342] Johnson
N50041 766465 Some Part Name SomeNoteK [343] Johnson
N60176 766499 Some Part Name SomeNoteX [342] Johnson
N60176 766499 Some Part Name SomeNoteX [343] Johnson
N60750 766503 Some Part Name SomeNoteU [342] Johnson
N60750 766503 Some Part Name SomeNoteU [343] Johnson
所以我在每个零件号上都有两个,甚至三个
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [343] Johnson
T50015 765963 Some Part Name SomeNoteA [342] Johnson
T50015 765963 Some Part Name SomeNoteA [343] Johnson
所以我想看到的是:
T50015 765963 Some Part Name SomeNoteA [342] Johnson
T60024 766068 Some Part Name SomeNoteB [342] Johnson
T60231 766093 Some Part Name SomeNoteA [342] Johnson
T60232 766094 Some Part Name SomeNoteA [342] Johnson
T70134 766150 Some Part Name SomeNoteA [342] Johnson
T70230 766153 Some Part Name SomeNoteC [342] Johnson
Y50078 766253 Some Part Name SomeNoteH [342] Johnson
N30026 766352 Some Part Name SomeNoteT [342] Johnson
N50041 766465 Some Part Name SomeNoteK [342] Johnson
N60176 766499 Some Part Name SomeNoteX [342] Johnson
N60750 766503 Some Part Name SomeNoteU [342] Johnson
所以我只希望每个唯一的零件号有一个唯一的行,而不是这里显示的dup零件号行
换言之,例如,我想要这个(一个partID只需要一行):
与DUP相比:
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [343] Johnson
发生的情况是,联接中有重复的行。记住,Distinct不一定会过滤select列表中的列(请在此处阅读:) 有多种解决方案,可从以下几方面入手:
SELECT DISTINCT * FROM (
select p.PartNum,
p.PartID,
pn.Name,
d.[Description],
n.Note as PartNote
from Part p
join PartName pn on pn.PartNameID = p.PartNameID
join ApplicationPaint ap on ap.partID = p.PartID
join [Application] a on a.ApplicationID = ap.ApplicationID
join [Description] d on d.DescriptionID = ap.DescriptionID
join Note n on n.NoteID = a.NoteID
join MYConfig mmy on mmy.MMYConfigID = a.MYConfigID
join Model mo on mo.ModelID = mmy.ModelID
where mmy.ModelId = 2673
and substring(n.Note, CHARINDEX(']', n.Note) + 2, LEN(n.Note))= 'Johnson'
)
使用GROUP BY而不是distinct,修改创建重复行的联接。比如:
select DISTINCT p.PartNum,
p.PartID,
pn.Name,
d.[Description],
n.Note as PartNote
from Part p
join (SELECT Distinct Name, PartNameID
FROM PartName) pn ON pn.PartNameId = p.PartNameID
join ApplicationPaint ap on ap.partID = p.PartID
join [Application] a on a.ApplicationID = ap.ApplicationID
join [Description] d on d.DescriptionID = ap.DescriptionID
join Note n on n.NoteID = a.NoteID
join MYConfig mmy on mmy.MMYConfigID = a.MYConfigID
join Model mo on mo.ModelID = mmy.ModelID
where mmy.ModelId = 2673
and substring(n.Note, CHARINDEX(']', n.Note) + 2, LEN(n.Note))= 'Johnson'
您已经从示例中省略了部分名称和注释,但我认为
DISTINCT
意味着它应该从结果中省略您指定的所有列都是重复的行,而不是任何重复的行
因此,由于您指定了p.PartNum
、p.PartID
、pn.Name
、d.[Description]
和n.Note
,因此只有那些值都重复的行才会被删除
例如,您说过您的结果包括:
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [342] Johnson
T70230 766153 Some Part Name SomeNoteC [343] Johnson
如果这些行真的是:
T70230 766153 CoolWidget1 "So much fun!" [342] Johnson
T70230 766153 CoolWidget1 "Buy one today!" [342] Johnson
T70230 766153 CoolWidget2 "Buy one today!" [343] Johnson
然后所有三行都将保留,因为您为
DISTINCT
运算符列出的所有五个列名的值都不完全相同。DISTINCT将合并行,但它们必须完全相同。从选择中去掉PartNote字段将获得唯一的集合
要获得示例中所示的PartNote,以下操作应该有效
select DISTINCT p.PartNum,
p.PartID,
pn.Name,
d.[Description],
min(PartNote)
....
group by p.PartNum, p.PartID, pn.Name, d.[Description]
明白了…是的,在某个时间,[]数字有一个不同。因为我不需要[]数字,所以我把它从最后一列中删掉,让它们都说是Johnson…然后使用了distinct。谢谢是的,我绝对不想做次选择…不好。让我试试这个组合,我不想要任何副选择…表现和糟糕的练习。嗯,必须有一种方法,不必进行子选择。同样地,[343]也不总是一样的……正如约翰纳森所说的,这可能就是我被愚弄的原因。。。
select DISTINCT p.PartNum,
p.PartID,
pn.Name,
d.[Description],
min(PartNote)
....
group by p.PartNum, p.PartID, pn.Name, d.[Description]