是否有其他方法可实现结果集row_number()并使用它来获取ROW_NUMBER之间的记录

时间:2019-04-28 07:12:37

标签: sql sql-server

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

问题是所有表的列名称相同,并且出现错误

  

为“ 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的新手,所以如果问题看起来很复杂,请原谅我。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您可以更简单地编写不带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
 . . .