将查询从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
有人可以帮帮我吗?
答案 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