#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]