作为子查询时,'offset ... fetch next ...' 不起作用

编程语言 2026-07-10

我想创建一个带有一段ids范围的临时表,以便在其他查询中复用它们。当我这样尝试时:

select ca.company_id
from company_account ca
order by ca.id desc
offset 0 rows 
fetch next 500000 rows only;

它按预期工作。但一旦把这个查询嵌入到另一个查询中,它就失败了:

DECLARE @company_ids TABLE(id BIGINT);

INSERT INTO @company_ids (id)
    (select ca.company_id
       from company_account ca
     order by ca.id desc
     offset 0 rows 
     fetch next 500000 rows only
     );

随之出现的错误信息如下:

[S0001][156] 第6行:在关键字 'ORDER' 附近的语法不正确。 [S0002][153] 第7行:FETCH语句中next选项的用法无效。

我到底在做什么错?

P.S.这个查询也能工作:

DECLARE @company_ids TABLE(id BIGINT);

INSERT INTO @company_ids (id)
    (select top 500000 ca.company_id
       from company_account ca
     );

解决方案

你拥有的不是子查询,它只是放在圆括号里的一个语句,这意味着它会被忽略。下面这个语句,例如,是有效的:

DECLARE @company_ids TABLE(id BIGINT);
SET STATISTICS XML ON;
INSERT INTO @company_ids (id)
(SELECT 1)

如果你想使用子查询,你需要真正有一个子查询,且还需要为它命名:

DECLARE @company_ids table (id bigint);

INSERT INTO @company_ids (id)
SELECT sq.company_id
FROM (SELECT ca.company_id
      FROM company_account ca
      ORDER BY ca.company_id DESC
      OFFSET 0 ROWS FETCH NEXT 500000 ROWS ONLY) sq;

不过,对于你的语句,甚至不需要子查询,下面就能正常工作:

DECLARE @company_ids table (id bigint);

INSERT INTO @company_ids (id)
SELECT ca.company_id
FROM company_account ca
ORDER BY ca.company_id DESC
OFFSET 0 ROWS FETCH NEXT 500000 ROWS ONLY;

db<>fiddle

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章