DISTINCT до сих пор дает мне дупс записи в результатах - PullRequest
0 голосов
/ 02 ноября 2011

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

, поэтому я получаю дубликаты, даже утроенные на каждом номере PartNumber

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

против. Dups:

T70230  766153  Some Part Name  SomeNoteC   [342] Johnson
T70230  766153  Some Part Name  SomeNoteC   [342] Johnson
T70230  766153  Some Part Name  SomeNoteC   [343] Johnson

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

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

0 голосов
/ 02 ноября 2011

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]
0 голосов
/ 02 ноября 2011

То, что происходит, - это то, что у вас есть дублированные строки в вашем соединении.Помните, что 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 вместо отдельных, чтобы изменить JOIN, который создает дублированные строки. Что-то вроде:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...