是否有任何替代方法可以实现结果集 row_number() 并使用它来获取ROW_NUMBER之间的记录



我正在尝试使用INNER JOIN从多个表中获取结果Row_number()集中的记录。

问题是所有表都有同名的列,我得到一个错误

多次指定列"DEPT_DSCR">

请记住,结果集中的查询是从过程自动生成的,因此我无法添加别名或任何内容。

这是我编写查询的方式

with resultset as 
(
     select  
         row_number() over (order by a.a) rownumber, 
         g.dept_dscr, i.dept_dscr 
     from 
         abc a  
     inner join 
         def g on g.dept_no = a.b  
     inner join 
         ghi i on i.dept_no = a.c 
     where 
         a.b = '640' and a.c = '640'
) 
select * 
from resultset  
where rownumber between 1 and 12 
order by rownumber

我是SQL Server的新手,所以如果问题看起来很复杂,请原谅我。

问题与

行号无关,而是与您返回两列具有相同名称的事实有关。表名或表别名不是返回的列名的一部分,因此r.dept_dscr和i.dept_dscr被视为相同。

如果两者都需要,可以通过将i.dept_dscr更改为 i.dept_dscr AS some _alias 来为其中一个指定别名(或两者(,其中some_alias是您选择的标识符。

您可以在没有 CTE 的情况下更轻松地编写此查询:

 select row_number() over (order by a.a) as rownumber, 
        g.dept_dscr, i.dept_dscr 
 from abc a join
      def g
      on g.dept_no = a.b join
      ghi i
      on i.dept_no = a.c 
 where a.b = 640 and a.c = 640  -- things that look like numbers usually are
 order by rownumber
 offset 0 fetch first 12 rows only;

具有讽刺意味的是,如果你这样写,你就不会有问题。 SQL Server 允许结果集复制列名,但不允许复制视图、子查询或 CTE。

不过,最好确定列的来源:

 select row_number() over (order by a.a) as rownumber, 
        g.dept_dscr as def_dept_dscr,
        i.dept_dscr as ghi_dep_dscr
 . . . 

最新更新