2017-02-03 5 views
1

Wie Sie Paging anwenden, wenn wir Union alle verwenden, um das Ergebnis aus zwei Tabellen zu bekommen. Unter dem Code hier bin ich doppelte Werte in 'row_num' Spalte, die für Paging verwendet wurde.SQL Server verwenden Union alle und Paging

;WITH resultSetCTE AS 
    (
SELECT 
    ROW_NUMBER() OVER 
    (
     ORDER BY nr.is_read,nr.is_read_cashier, 
    CASE @columnSortNameDirection WHEN 'Pin' THEN r.name END ASC, 
    CASE @columnSortNameDirection WHEN 'PinDesc' THEN r.firstname END DESC 
    ) AS 'row_num', 
    r.clave_receiver AS 'Pin', 
    r.id_branch AS 'Id_Branch', 
    r.id_receiver AS 'Id_receiver', 
    s.name_sender AS 'SenderFullName', 
    r.name_receiver AS 'ReceiverFullName', 
    r.id_flag_receiver AS 'Status', 
    pas.option_name AS 'ApprovalStatus', 
    r.mode_pay_receiver AS 'PaymentModeId' 


    UNION ALL 

    SELECT 
    ROW_NUMBER() OVER 
    (
    ORDER BY nr.is_read,nr.is_read_cashier, 
    CASE @columnSortNameDirection WHEN 'Pin' THEN r.name END ASC, 
    CASE @columnSortNameDirection WHEN 'PinDesc' THEN r.firstname END DESC 
    ) AS 'row_num', 
    r.clave_receiver AS 'Pin', 
    r.id_branch AS 'Id_Branch', 
    r.id_receiver AS 'Id_receiver', 
    s.name_sender AS 'SenderFullName', 
    r.name_receiver AS 'ReceiverFullName', 
    r.id_flag_receiver AS 'Status', 
    pas.option_name AS 'ApprovalStatus', 
    r.mode_pay_receiver AS 'PaymentModeId' 

) 
    SELECT *, 
(SELECT COUNT(1) FROM resultSetCTE) AS 'RecordCount' 
FROM resultSetCTE 
WHERE row_num BETWEEN (1 - 1) * 15 + 1 AND 1 * 15 
ORDER by IsRead,IsReadCashier 

Antwort

1

wenn Sie nicht die komplette Abfrage gebucht haben, könnten Sie so etwas wie diese

declare @columnSortNameDirection varchar(5) 
;WITH resultSetCTE AS 
    (

select ROW_NUMBER() OVER 
(
     ORDER BY nr.is_read,nr.is_read_cashier, 
    CASE @columnSortNameDirection WHEN 'Pin' THEN r.name END ASC, 
    CASE @columnSortNameDirection WHEN 'PinDesc' THEN r.firstname END DESC 
) AS 'row_num',* from ( SELECT  
    r.clave_receiver AS 'Pin', 
    r.id_branch AS 'Id_Branch', 
    r.id_receiver AS 'Id_receiver', 
    s.name_sender AS 'SenderFullName', 
    r.name_receiver AS 'ReceiverFullName', 
    r.id_flag_receiver AS 'Status', 
    pas.option_name AS 'ApprovalStatus', 
    r.mode_pay_receiver AS 'PaymentModeId' 
    UNION ALL 
    SELECT 

    r.clave_receiver AS 'Pin', 
    r.id_branch AS 'Id_Branch', 
    r.id_receiver AS 'Id_receiver', 
    s.name_sender AS 'SenderFullName', 
    r.name_receiver AS 'ReceiverFullName', 
    r.id_flag_receiver AS 'Status', 
    pas.option_name AS 'ApprovalStatus', 
    r.mode_pay_receiver AS 'PaymentModeId') as A 

) 
    Select *, 
(SELECT COUNT(1) FROM resultSetCTE) AS 'RecordCount' 
FROM resultSetCTE 
WHERE row_num BETWEEN (1 - 1) * 15 + 1 AND 1 * 15 
ORDER by IsRead,IsReadCashier 
+0

bereiten Abfrage funktioniert ziemlich gut nur benötigt, um zu ändern wählen ROW_NUMBER() OVER ( ORDER BY A.IsRead ) – Nikki

0

Verwenden Sie stattdessen offset/fetch. Es löst alle Ihre Probleme. Mehr Infos hier: https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx

Code-Beispiel (bitte aktualisieren, indem Sie Ihre Bedürfnisse):

;WITH [resultSetCTE] AS 
(
    SELECT 
     [col] = [object_id] 
    FROM 
     [sys].[tables] 

    UNION ALL 

    SELECT 
     [col] = [object_id] 
    FROM 
     [sys].[tables] 
) 
SELECT 
    * 
FROM 
    [resultSetCTE] 
ORDER BY 
    [col] 
OFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY;