2016-10-06 13 views
0

MysqlからSQL Serverへのクエリの移行には多くの問題があります。私は少し複雑ですが、mysqlでうまく動作するこのクエリを持っています。SQL Server select queries union allとlimit

返される行が多いため、テーブル・ユニオンからすべてを選択して、別の表から等しくないか、結果の改ページを行うことができます。私が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行を返します。

制限なしのクエリは、次の(このクエリがうまく機能)であります最初のテーブルと2番目のテーブルから9行が、私は2テーブルの結合から、例えば10行をページ付けする必要があります。

;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

一つの問題は、1から始まるROW_NUMBER SQL Serverのことである - あなたのもう一つの問題はそう9行/

される9 - あなたは0を求めているので、あなたは、0を得ることはありません(そうするために論理的である)UNIONの各部分のために別々に計算されるROW_NUMBERであること - 私はそれとSQL Serverの再試み

;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 
+0

ありがとう、しかし、別の質問、タブラの値は "A19B02"のような文字列にすることができます、SQL Serverは**私はこれを解決することができます** varはint型文字列に変換することはできません? – bcg

+1

検索項目を引用符で囲む必要があります。たとえば、tabla = '1997'または文字列変数を使用します – Cato

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 
+0

試みる2 CTE

の行数を計算してみてください私はこのエラーになります:** sintaxエラーはどこに**私は、SQL Serverが参照するwhere節はどこにあると思いますか?Where RowNum_ idea? – bcg

関連する問題