Jac*_*ard 6 sql case distinct sql-order-by
我已经看过很多关于这个场景的问题/论坛帖子,但是我要么不理解解决方案,要么提供的解决方案对于那个特定问题太具体了,我不知道如何将它应用到我的情况中.我有以下查询:
SELECT DISTINCT d.*
FROM Data d
JOIN Customers c
ON c.Customer_Name = d.Customer_Name
AND c.subMarket = d.subMarket
JOIN Sort s
ON s.Market = c.Market
ORDER BY d.Customer_Name, d.Category, d.Tab, d.SubMarket,
CASE s.sortBy
WHEN 'Comp_Rank'
THEN d.Comp_Rank
WHEN 'Market_Rank'
THEN d.Market_Rank
ELSE d.Other_Rank
END
Run Code Online (Sandbox Code Playgroud)
我在MySQL数据库上使用了那个确切的查询,它运行得很好.我们最近切换到SQL Server数据库,现在它不起作用,我收到错误:
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Run Code Online (Sandbox Code Playgroud)
我已经尝试将s.*添加到SELECT中(因为s.sortBy在CASE中)并且没有改变任何东西我也尝试列出Data中的每个字段并在SELECT中排序并且导致相同的精确错误.
数据中实际上没有重复,但是当我进行连接时,每个项目会产生4个完全重复的行,我不知道如何修复它,这就是我最初添加DISTINCT的原因.我尝试了LEFT JOIN,INNER JOIN等等的各种变化......并且无法获得不同的结果.无论如何,任何一个问题的解决方案都可以,但我假设需要更多信息才能找出JOIN重复问题.
编辑:我刚刚意识到我错误地输入了ORDER BY中的一些字段(例如,n.Category,n.Tab应该是d.Category,d.Tab).ORDER BY中的所有内容都来自我选择的数据表*.正如我所说,我也尝试列出SELECT中的每个字段,但没有帮助.
正如错误所暗示的那样,当您使用时select distinct,您必须按照select子句中的表达式进行排序.所以,你case的问题以及所有列都不是d.
您可以通过使用group by而不是包括要排序的列来解决此问题.由于案例包含一列s,您需要在case(或至少该列)中包含group by:
SELECT d.*
FROM Data d JOIN
Customers c
ON c.Customer_Name = d.Customer_Name AND
c.subMarket = d.subMarket JOIN Sort s
ON s.Market = c.Market
GROUP BY "d.*",
(CASE s.sortBy WHEN 'Comp_Rank' THEN d.Comp_Rank
WHEN 'Market_Rank' THEN d.Market_Rank
ELSE d.Other_Rank
END)
ORDER BY d.Customer_Name, d.Category, d.Tab, d.SubMarket,
(CASE s.sortBy WHEN 'Comp_Rank' THEN d.Comp_Rank
WHEN 'Market_Rank' THEN d.Market_Rank
ELSE d.Other_Rank
END)
Run Code Online (Sandbox Code Playgroud)
请注意,"d.*"它在引号中.您需要列出中的所有列group by.