Reputation: 5384
I'm using MS-SQL 2012 and have 2 tables that contains similar data field types.
I'm writing a stored procedure that needs to get 10 records from Table1 using a specific sort order and 10 records from Table2 using a different sort order.
I also need to use paging
Something like
SELECT Field1, Field2, Field3
FROM TableAAAA
ORDER BY FieldSort1 DESC --> DateTime
OFFSET (@PageIndex-1) * 10 ROWS
FETCH NEXT @PageSize ROWS ONLY
UNION ALL
SELECT Field1, Field2, Field3
FROM TableBBBB
ORDER BY FieldSort2 --> INT
OFFSET (@PageIndex-1) * 10 ROWS
FETCH NEXT @PageSize ROWS ONLY
If I use a UNION ALL, I can only sort at the end of it so I cannot use the code above.
Upvotes: 1
Views: 250
Reputation: 70523
Here is a way (since you know the first one is only going to be page size...
WITH t1 AS
(
SELECT Field1, Field2, Field3, ROW_NUMBER() OVER (ORDER BY FieldSort1) AS outerSort1, 0 as outerSort2
FROM TableAAAA
ORDER BY FieldSort1
OFFSET (@PageIndex-1) * 10 ROWS
FETCH NEXT @PageSize ROWS ONLY
), t2 AS
(
SELECT Field1, Field2, Field3, 0 as outerSort1, ROW_NUMBER() OVER (ORDER BY FieldSort2) AS outerSort2
FROM TableBBBB
ORDER BY FieldSort2
OFFSET (@PageIndex-1) * 10 ROWS
FETCH NEXT @PageSize ROWS ONLY
)
SELECT Field1, Field2, Field3 FROM T1
UNION ALL
SELECT Field1, Field2, Field3 FROM T2
ORDER BY outerSort1, outerSort2
Upvotes: 3
Reputation: 31785
You could use either derived tables or CTEs:
WITH cteA AS (
SELECT Field1, Field2, Field3
FROM TableAAAA
ORDER BY FieldSort1
OFFSET (@PageIndex-1) * 10 ROWS
FETCH NEXT @PageSize ROWS ONLY
),
cteB AS (
SELECT Field1, Field2, Field3
FROM TableBBBB
ORDER BY FieldSort2
OFFSET (@PageIndex-1) * 10 ROWS
FETCH NEXT @PageSize ROWS ONLY
)
SELECT * FROM cteA
UNION ALL
SELECT * FROM cteB
Upvotes: 2