【问题标题】:SQL Server select queries union all and limitSQL Server 选择查询联合所有和限制
【发布时间】:2017-02-15 10:28:25
【问题描述】:

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

我有一个从表联合选择到另一个表不等于的选择以及对结果进行分页的限制,因为返回的行很多。当我尝试迁移到 SQL Server 时,使用联合的选择工作正常。当我阅读如何在 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

有人可以帮帮我吗?

【问题讨论】:

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


    【解决方案1】:

    这里有 2 个单独的行号。试试这个:

    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
    

    【讨论】:

    • 我试过了,sql server 给我返回了这个错误:sintax error near where 我认为 sql server 引用的 where 子句是 where RowNum有什么想法吗??
    【解决方案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
    

    【讨论】:

    • 谢谢,但另一个问题,tabla的值可以是像“A19B02”这样的字符串,sql server告诉我var不能从int转换为字符串。 我该如何解决这个问题?
    • 您必须将搜索项括在引号中,例如 tabla = '1997' 或使用字符串变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多