SQL Server选择查询union all并限制

时间:2016-10-06 15:27:56

标签: sql sql-server sql-server-2008 sorting pagination

将查询从Mysql迁移到SQL Server有很多问题。我有这个查询有点复杂但在mysql中它工作正常。

我从表联合中选择all到另一个表中的select不等于以及对结果进行分页的限制因为返回的行很多。当我尝试迁移到SQL Server时,使用union的选择工作正常。当我阅读如何在T-SQL中实现限制时,在stackoverflow和另一个页面中我学会了如何操作,但是当我尝试将其应用于我的查询时它不会运行并且SQL Server返回错误。

无限制的查询如下(此查询效果很好):

SELECT
    'false' AS historico,
    '' AS tabla,
    a.nombre,
    a.apellido1,
    a.apellido2
FROM 
    persons a
WHERE 
    a.eliminado = 'N'
    AND (idconv = 30)

UNION ALL

SELECT
    'true' AS historico,
    b.tabla,
    b.nombre,
    b.apellido1,
    b.apellido2
FROM 
    persons_hist b
WHERE 
    b.eliminado = 'N'
    AND (tabla = '1955')
ORDER BY 
    apellido1 ASC

但是当我尝试添加“分页”,例如从0开始的10行时,这个查询返回第一个表中的18行9行和第二个表中的9行,但是我必须对例如10行进行分页。联合2桌。

;WITH Results_CTE AS
(
    select 
        ROW_NUMBER() OVER (ORDER BY apellido1 asc ) AS RowNum , 
        'false' as historico,
        '' as tabla,
        a.nombre, a.apellido1, a.apellido2 
    from 
        persons a 
    where 
        a.eliminado = 'N' and (idconv = 30) 

    union all 

    select 
        ROW_NUMBER() OVER (ORDER BY apellido1 asc ) AS RowNum , 
        'true' as historico,
        b.tabla, b.nombre, b.apellido1, b.apellido2 
    from 
        persons_hist b 
    where 
        b.eliminado = 'N' and (tabla = '1997')
)
SELECT *
FROM Results_CTE
WHERE RowNum >= 0
  AND RowNum < 0 + 10

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

一个问题是SQL SERVER row_number从1开始 - 你没有得到0,所以你要求0 - 9这将是9行/

你的另一个问题似乎是为UNION的每个部分单独计算row_number(这是合乎逻辑的) - 尝试计算第二个CTE中的行号

    ;WITH Results_CTE1 AS
(

    select  'false' as historico,'' as tabla,a.nombre,a.apellido1,a.apellido2 from persons a where a.eliminado = 'N' and ( idconv = 30 ) 
    union all 
    select  'true' as historico,b.tabla,b.nombre,b.apellido1,b.apellido2 from persons_hist b 
    where b.eliminado = 'N' and ( tabla = '1997' )
),
Results_CTE AS 
(
    SELECT *,ROW_NUMBER() OVER (ORDER BY apellido1 asc ) AS RowNum FROM Results_CTE1
)

SELECT *
FROM Results_CTE
WHERE RowNum BETWEEN 1 AND 10

答案 1 :(得分:1)

这里有2个独立的rownumbers。试试这个:

WITH Results_CTE AS
(
'false' as historico,'' as tabla,a.nombre,a.apellido1,a.apellido2 from persons a where a.eliminado = 'N' and ( idconv = 30 ) 
union all 
'true' as historico,b.tabla,b.nombre,b.apellido1,b.apellido2 from persons_hist b 
where b.eliminado = 'N' and ( tabla = '1997' )
) 

select *
from
(

select CTE1.*, row_number() over (order by apellido1 ) as RowNum
from Results_CTE
)    
where RowNum <=10