#tsql
#tsql
Вопрос:
SELECT DISTINCT f.FoodNumber,
f.FoodID,
fn.Name AS FoodName,
d.[Description],
substring(n.Note, CHARINDEX(']', n.Note) 2,
LEN(n.Note)) AS FoodNote
FROM Food f
JOIN FoodName fn
ON fn.FoodNameID = f.FoodNameID
JOIN FoodPart fp
ON fp.FoodID = p.FoodID
JOIN [Application] a
ON a.ApplicationID = fn.ApplicationID
LEFT JOIN [Description] d
ON d.DescriptionID = ap.DescriptionID
JOIN Note n
ON n.NoteID = a.NoteID
JOIN FoodYear fy
ON fy.FoodYearID = a.FoodYearID
WHERE mmy.FoodlId = 33997332
ORDER BY CASE
WHEN substring(n.Note, 1, 1) = 'A' THEN 1
WHEN substring(n.Note, 1, 1) = 'Y' THEN 2
WHEN substring(n.Note, 1, 1) = 'D ' THEN 3
END,
f.FoodNumber,
f.FoodID,
fn.Name,
d.[description],
substring(n.Note, CHARINDEX(']', n.Note) 2, LEN(n.Note))
Я продолжаю получать сообщение об ошибке, в котором говорится, что не все элементы в order by находятся в списке выбора.
Обновить
Это работает, но я получаю номера деталей dup в списке…Я не могу добавить distinct, иначе он будет жаловаться, что у меня нет чего-то в списке выбора для order by
select ap.applicationID,
ap.NoteID,
f.FoodNumber,
n.Note as PartNote,
f.FoodID,
q.Quantity,
fn.Name as FoodName,
d.[Description]
from Food f
join FoodName fn on fn.FoodNameID = f.FoodNameID
join FoodPart fp on fp.partID = f.FoodID
join Quantity q on q.QuantityID = ap.QuantityID
join [Application] a on a.ApplicationID = ap.ApplicationID
left join [Description] d on d.DescriptionID = ap.DescriptionID
join Note n on n.NoteID = ap.NoteID
join Note n2 on n2.NoteID = a.NoteID
join FoodYear fy on fy.FoodYearID = a.FoodYearID
join Model mo on mo.ModelID = fy.ModelID
where fy.ModelId = @ModelId
order by
case when substring(f.FoodNumber, 1, 1) = 'T' then 1
when substring(f.FoodNumber, 1, 1) = 'R' then 2
when substring(f.FoodNumber, 1, 1) = 'C' then 3
else
substring(f.FoodNumber, 1, 1)
END,
f.FoodNumber asc,
f.FoodID,
fn.Name ,
d.[description],
substring(n.Note, CHARINDEX(']', n.Note) 2, LEN(n.Note))
Комментарии:
1. Проблема в fn. Имя, которое вы переименовываете FoodName (Вам нужно будет использовать FoodName в порядке по)
2. О БОЖЕ, это намного лучше! Вау! Кроме того, я бы переместил последнюю строку ORDER BY в SELECT. Возможно, также потребуется переместить этот оператор case. Не знаю, является ли это фактической причиной; мой sql заржавел.
3. спасибо за ваши комментарии… Я в порядке. Я добавил еще один and в свое предложение where и отфильтровал другой идентификатор в дополнение к ModelID, и все готово. Я был недостаточно конкретен … слишком общий только для modelid.
Ответ №1:
Вам нужно добавить SUBSTRING(n.Note, 1, 1)
в SELECT
список или удалить DISTINCT
.
В данный момент вы выполняете DISTINCT
on SUBSTRING(n.Note, CHARINDEX(']', n.Note) 2, LEN(n.Note)) AS FoodNote
, но для этого может быть несколько возможных SUBSTRING(n.Note, 1, 1)
значений, которые все сопоставляются с одним и тем же значением.
WITH n(Note) AS
(
SELECT '' UNION ALL
SELECT 'A' UNION ALL
SELECT ']'
)
SELECT SUBSTRING(n.Note, CHARINDEX(']', n.Note) 2,
LEN(n.Note)) AS FoodNote
,SUBSTRING(n.Note, 1, 1) AS SS
FROM n
ВОЗВРАТ
FoodNote SS
-------- ----
A
]
Вы также можете использовать GROUP BY
вместо DISTINCT
и ORDER BY MIN(SUBSTRING(n.Note, 1, 1))
, чтобы выражение стало однозначным в этом случае и было разрешено.
т.е. что-то вроде
;WITH CTE AS
(
SELECT
f.FoodNumber,
f.FoodID,
fn.Name AS FoodName,
d.[Description],
substring(n.Note, CHARINDEX(']', n.Note) 2,
LEN(n.Note)) AS FoodNote,
substring(n.Note, 1, 1) AS N1
FROM Food f
JOIN FoodName fn
ON fn.FoodNameID = f.FoodNameID
JOIN FoodPart fp
ON fp.FoodID = p.FoodID
JOIN [Application] a
ON a.ApplicationID = fn.ApplicationID
LEFT JOIN [Description] d
ON d.DescriptionID = ap.DescriptionID
JOIN Note n
ON n.NoteID = a.NoteID
JOIN FoodYear fy
ON fy.FoodYearID = a.FoodYearID
WHERE mmy.FoodlId = 33997332
)
SELECT FoodNumber,
FoodID,
FoodName,
[Description],
FoodNote
FROM CTE
GROUP BY FoodNumber,
FoodID,
FoodName,
[Description],
FoodNote
ORDER BY CASE
WHEN MIN(N1) = 'A' THEN 1
WHEN MIN(N1) = 'Y' THEN 2
WHEN MIN(N1) = 'D ' THEN 3
END,
FoodNumber,
FoodID,
FoodName,
[Description],
FoodNote
Комментарии:
1. спасибо, у меня болит голова, когда я пытаюсь это переварить …. с вашим оператором WITH разве вам не нужно было бы выполнять проверку подстроки note .. у вас есть это просто (Примечание)
2. что касается вашей второй идеи использовать Group by, то есть вы имеете в виду взять что из предложения where и добавить что? И как group by позволяет обходить то, что должно быть обойдено?
3. кто-нибудь знает, почему я получаю дубликаты, и поскольку я не могу использовать distinct, как я могу выполнить свой рабочий запрос… вторая вставка выше и удаление дубликатов? Я просто получаю удвоение каждого продукта питания .. dups.
4. разве это не снижение производительности с вложенными выборками, подобными этому, для такого большого количества событий?
5. @CoffeeAddict — Ничего сверх исходного запроса. SQL Server просто расширяет их.
Ответ №2:
возможно, добавить
case when when substring(n.Note, 1, 1) = 'A' then 1
when substring(n.Note, 1, 1) = 'Y' then 2
when substring(n.Note, 1, 1) = 'D ' then 3
END,
для вашего выбора?
Хотя я не думаю, что order by требовал, чтобы что-то было в select.
Также: у вас нет else в случае, если note не является Y или D.
Комментарии:
1. RE: «Я не думаю, что для order by требуется, чтобы что-то было в select.», вы делаете, когда используется
DISTINCT
, поскольку для строки может быть более одного совпадающего значения.