当我们使用union all从两个表中获取结果时如何应用分页。这里的代码是我在'row_num'中获得重复值的代码已用于分页的列。
;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
答案 0 :(得分:1)
虽然您还没有发布完整的查询,但您可以尝试类似这样的内容
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
答案 1 :(得分:0)
请改用offset / fetch。它解决了你所有的问题。 更多信息:https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
代码示例(请根据您的需要更新):
;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;