Paginacja wyników z union selecta

0

Cześć

Mam dwie tabele (baza mssql): Doc(Id, CreationDate, Title) i Message(Id, CreationDate, Message). Muszę zrobić paginację z połączonych danych, z tych dwóch tabel w stylu "pokaż więcej". Jedynym sensownym rozwiązaniem jakie przychodzi mi do głowy jest filtrowanie po creationDate np.

-- zapytanie pobierające kolejna stronę (rekordy starsze od tych z poprzedniej strony)

select x.*
from (
    select x.Id, x.CreatedAt, 'Doc' as ActType 
    from dbo.[Doc] x 
    where x.CreatedAt < '2016-01-15 07:30:00' 

    union all select x.Id, x.CreatedAt, 'Message' as ActType 
    from dbo.[Message] x 
    where x.CreatedAt < '2016-01-15 07:30:00' 
) as x 
order by x.CreatedAt desc, x.Id desc, x.ActType desc
offset 0 rows
fetch first 6 rows only

Jednak jest szansa (niska ale jest), że Doc i Message będą miały rekordy z tą samą datą, przez co niektóre rekordy mogą się w ogóle nie wyświetlić w wynikch.

Inne opcje:

  • synchronizacja dwóch tabel w innej tabeli, w której przydzielane byłyby unikalne id (taki pseudo indexed view) - czasochłonne
  • dynamiczne przydzielanie unikalnych id przez row_count() - wolne

Macie jakieś pomysły jakby to inaczej rozwiązać? Czy może nie przejmować się tym na razie bo takie przypadki będą rzadkie?

0

[sql]IF OBJECT_ID('Clients', 'U') IS NOT NULL
DROP TABLE Clients
IF OBJECT_ID('Participants', 'U') IS NOT NULL
DROP TABLE Participants
IF OBJECT_ID('Conference', 'U') IS NOT NULL
DROP TABLE Conference
IF OBJECT_ID('Workshop', 'U') IS NOT NULL
DROP TABLE Workshop
IF OBJECT_ID('Conference_day', 'U') IS NOT NULL
DROP TABLE Conference_day
IF OBJECT_ID('Conference_day_booking', 'U') IS NOT NULL
DROP TABLE Conference_day_booking
IF OBJECT_ID('Workshop_booking', 'U') IS NOT NULL
DROP TABLE Workshop_booking
IF OBJECT_ID('Conference_day_reservations', 'U') IS NOT NULL
DROP TABLE Conference_day_reservations
IF OBJECT_ID('Workshop_reservation', 'U') IS NOT NULL
DROP TABLE Workshop_reservation
[/sql]

0

[ sql]
IF OBJECT_ID('Clients', 'U') IS NOT NULL
DROP TABLE Clients
[ /sql]

0

@Paweł Dmitruk nie bardzo, bo tak jak pisałem row_count daje niską wydajność.

0

Ale dlaczego chcesz sterować datą, zamiast manipulować OFFSET 0 ROWS ?

Inne pytanie, są założone jakieś indeksy? Możesz je dodawać/zmieniać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1