【问题标题】:this sql query works in mysql but not in mssql此 sql 查询在 mysql 中有效,但在 mssql 中无效
【发布时间】:2015-10-21 12:15:37
【问题描述】:

mysql:

SELECT * 
FROM (select * from songs order by artist asc) as songs2 
WHERE artist LIKE 'a%' GROUP BY artist`

mssql:

SELECT * 
FROM (select top 1000 * from songs order by artist asc) as songs2  
WHERE artist LIKE 'a%' GROUP BY artist

这在 mysql 中有效,但在 mssql 中我得到一个错误:

列 'songs2.id' 在选择列表中无效,因为它不是 包含在聚合函数或 GROUP BY 子句中

++++++++++++++++++++ 现在我用这个查询选择: SELECT artist,album,song from (select top 1000 * from song order by year asc, artist asc) as song2 where artist like 'a%' group by artist,album,song; 但它不按艺术家分组,我希望查询中每首歌曲只有一位艺术家

【问题讨论】:

  • 按照错误消息中的说明执行操作并删除该子句。它实际上并没有做任何事情(不能保证外部查询尊重该顺序,即使它可能会这样做)。
  • 我把sql改成

标签: mysql sql-server


【解决方案1】:

在 mysql 中,您可以选择不在 group by 语句中的值。在 mssql 中是不可能的。

SELECT artist FROM 
(
    select * from songs 
) as songs2 
where artist like 'a%' group by artist;

您也不能在子查询中使用 order by。

【讨论】:

  • 其实你可以在sqlserver上结合TOP在子查询中使用ORDER BY
【解决方案2】:

删除ORDER BY 子句:

SELECT * FROM 
(
    select * from songs 
) as songs2 
where artist like 'a%';

没有必要对sub-query 中的行进行排序,因为您没有使用TOP 来获取其中的NOFFSET 来应用分页或FOR XML 来订购XML 节点。

如果要对结果进行排序,请在外部查询中进行:

SELECT * FROM 
(
    select * from songs 
) as songs2 
where artist like 'a%'
order by year asc, artist asc;

所以,基本上,你可以把它做短:

SELECT *  
from songs 
where artist like 'a%' 
order by year asc, artist asc;

【讨论】:

  • ]列 'songs2.id' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
  • @shervinkhaleghjoo 删除GROUP BY 子句或在其中添加所有列。
【解决方案3】:

Order By in subquery Require TOP/OFFSET/FOR XML Cluase

SELECT artist FROM 
(
    select top 100 percent * from songs 
    order by year asc, artist asc
) as songs2 
where artist like 'a%' group by artist;

【讨论】:

  • ]列 'songs2.id' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中
  • 我也想知道歌名,只有艺人是不够的
【解决方案4】:

这将为每位艺术家找到 1 首歌曲,最多可找到 1000 首歌曲:

SELECT TOP 1000 
  artist,album,song 
FROM 
(
  SELECT 
    artist,album,song, 
    row_number() over (partition by artist order by (SELECT 1)) rn
  FROM table_name 
  WHERE artist like 'a%' 
) as t2 
WHERE rn = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多