DISTINCT по-прежнему выдает мне дублирующие записи в результатах

#tsql

#tsql

Вопрос:

Я получаю двойные результаты для каждого part…so Я, очевидно, не использую 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
 

Поэтому я хочу, чтобы для каждого уникального номера детали была только одна уникальная строка, а не повторяющиеся строки номера детали, отображаемые здесь.

Другими словами, например, я хочу это (одна строка только для PartID):

 T70230  766153  Some Part Name  SomeNoteC   [342] 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
 

Ответ №1:

Вы опустили имена частей и примечания из своего примера, но я полагаю 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 оператора.

Комментарии:

1. понял … да, иногда есть разница в числах []

2. так оно и было. Итак, поскольку мне не нужны числа [], я вырезал их из последнего столбца, чтобы все они говорили Johnson … и тогда distinct работал нормально. Спасибо!

Ответ №2:

Происходит то, что у вас есть дублированные строки в вашем соединении. Помните, что Distinct не обязательно фильтрует столбцы в списке выбора (читайте об этом здесь: http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx ).

Существует ряд решений, для этого из:

 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'
 

Комментарии:

1. да, определенно не хочу делать дополнительные выборки … плохо. Позвольте мне попробовать группу по

2. Я не хочу никаких дополнительных выборов … производительность и просто плохая практика. Хм, должен быть способ без необходимости делать дополнительный выбор. Опять же, [343] не всегда являются same…so как сказал Джонатан, вероятно, именно поэтому я получаю двойки…

Ответ №3:

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]