Не все элементы по порядку находятся в Select

#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 , поскольку для строки может быть более одного совпадающего значения.