Tsql DISTINCT仍然在结果中为我提供dups记录

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

我的每个部分都得到了双重结果…所以我显然没有在这里使用Distinct,或者需要使用分组

例如:

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]