并非Order by中的所有项目都在Select中

时间:2011-11-09 18:05:10

标签: 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))  

我不断收到错误消息,说明订单中的所有商品都不在选择列表中。

更新

这有效,但是我列出了重复的部件号...我不能添加明显的或者它会抱怨我在订单的选择列表中没有东西

   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))

2 个答案:

答案 0 :(得分:0)

或许添加

   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, 

到您的选择?

虽然我不认为订单需要在选择中出现。

另外:如果音符不是A ​​Y或D,那么你没有其他情况。

答案 1 :(得分:0)

您需要将SUBSTRING(n.Note, 1, 1)添加到SELECT列表或删除DISTINCT

您目前正在DISTINCT上进行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代替DISTINCTORDER 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