【问题标题】:Subquery in select not working in SQL Server选择中的子查询在 SQL Server 中不起作用
【发布时间】:2021-12-05 06:50:43
【问题描述】:

我正在使用 SQL Server,但不知何故它不接受我的代码(请参阅下面的错误/结果)。我的目标是在每列中显示每个游戏平台的全球销量前 10 名游戏

SELECT TOP 10 
    (SELECT g_name FROM vgsales$ WHERE g_platform = 'X360') AS g_namex360, 
    (SELECT g_name FROM vgsales$ WHERE g_platform = 'PS2') AS g_nameps2
FROM 
    vgsales$
ORDER BY 
    Global_Sales;

错误结果:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

下表是 vgsales$

CREATE TABLE vgsales$ (
g_rank INT,
g_name VARCHAR(100),
g_platform VARCHAR(100),
g_year INT,
g_genre VARCHAR(100),
g_publisher VARCHAR(100),
Global_Sales INT
);

【问题讨论】:

  • 不要从不从不发布表格图片。将CREATEINSERT 语句发布为文本
  • 感谢您的帮助,对此深表歉意。这是我第一次来这里。关于如何解决这个问题的任何想法?
  • 它不会接受我的代码是什么意思?你有错误吗?如果是这样,请向我们展示该错误。或者你只是没有得到任何结果?然后请向我们展示表结构(列名和数据类型以及任何约束)和示例数据以查看您选择的内容
  • 谢谢。现在希望能更清楚地说明问题。

标签: sql-server subquery


【解决方案1】:

您在 select 语句中使用的子查询应返回单个值,以便查询运行而不会出错。以下查询将毫无问题地运行,但不会给您预期的结果。

SELECT TOP 10
    (SELECT g_name FROM vgsales$ x WHERE g_platform = 'X360' AND a.g_rank = x.g_rank) AS g_namex360, 
    (SELECT g_name FROM vgsales$ p WHERE g_platform = 'PS2' AND a.g_rank = p.g_rank) AS g_nameps2
FROM 
    vgsales$ a
ORDER BY 
    Global_Sales;
 

下面的查询,虽然可能不是你想要的格式,但是会返回正确的结果。

WITH cte AS
(
    SELECT
       *,
       ROW_NUMBER() OVER(PARTITION BY g_platform ORDER BY Global_Sales DESC) AS RN
    FROM vgsales$ 
)
SELECT *
FROM cte
WHERE RN <= 10

【讨论】:

  • 这太棒了!作为 SQL 的新手,我对此感到沮丧,这对我帮助很大!非常感谢。还有很多东西要学,因为我可以从中学习代码。
猜你喜欢
  • 1970-01-01
  • 2018-09-10
  • 2021-07-23
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多