Selektywne Naciśnięcie Predykatu Do Oglądania

0

Pytanie

Mam wielki tabela przechowywania kolumn, która jest często aktualizowana. Nie pobierania aktualizacji bezpośrednio do oryginalnej tabeli, bo w większości przypadków to doprowadzi do tego, że mała ilość aktualizacji doprowadzi do przebudowy całego mikro-klucza tabeli. Zamiast tego przedstawię aktualizacji w tabeli aktualizacji i podczas kwerendy połączyć oba. W praktyce działa to dobrze.

Więc uprościć sytuację, przedstawię to w postaci users_view.

CREATE OR REPLACE VIEW users_view AS (
    SELECT * FROM users
    UNION ALL 
    SELECT * FROM user_changes
    QUALIFY ROW_NUMBER() OVER(
        PARTITION BY id 
        ORDER BY last_updated_at DESC
    ) = 1
)

Oba users stół i user_changes tabela ma ten sam schemat, co i konfiguracja wybranych partycji. W ten sposób mogę korzystać z listy rozwijanej predykatów w widoku, aby wybrać użytkowników jedynie w zakresie prawidłowego klucza. Załóżmy, że to account_id.

SELECT * FROM users_view
WHERE account_id = 1234

Ale w users stół trochę więcej, niż user_changes tabela i chciałbym dodać jeszcze więcej predykatów w users tabela bez dodawania dodatkowych predykatów w user_changes stół. Dlaczego? Bo na zgodność z users tabela, choć dokładna na 98%, zawiera wyniki fałszywie dodatnie/ujemne wyniki. Szczegóły user_changes są niezbędne do tego, aby wszystko naprawić. Jak by to wyglądało poza prezentacji, to:

SELECT * FROM (
    SELECT * FROM users
    WHERE account_id = 1234 AND city = 'Chicago'
    UNION ALL 
    SELECT * FROM user_changes
    WHERE account_id = 1234
    QUALIFY ROW_NUMBER() OVER(
        PARTITION BY id 
        ORDER BY last_updated_at DESC
    ) = 1
)
WHERE account_id = 1234 AND city = 'Chicago'

Jak by nieciekawie to wyglądało, to o wiele bardziej efektywne. Wszystkie warunki mogą być zastosowane do znacznie większej users tabela, ale tylko niezmienne warunki mogą być zastosowane do users_changes tabela. czyli użytkownik może zmieniać miasta, ale użytkownik nie może zmieniać konta. Drugi uruchomienie wszystkich warunków po zjednoczeniu polega na tym, aby uchwycić wszystkie zmiany, które user_changes wprowadziła.

To pompatycznie pisać, a tym bardziej w miarę zwiększania się złożoności zapytania i zaangażowania twórców zapytań. Dlatego szukam sposobu, aby przekonać harmonogramu sql pominąć usuwanie predykatów niektórych predykatów na moim user_changes tabela bez konieczności formatowania zapytanie w ten sposób. Najlepiej z widokiem.

PSUEDO SQL. PSUEDO SQL. PSUEDO SQL

W moich najśmielszych marzeniach mógłbym określić harmonogramu zapytań, gdzie może korzystać z predykaty partycji, a gdzie może korzystać z predykatów, nie odnoszące się do sekcji.

CREATE OR REPLACE VIEW users_view AS (
    SELECT * FROM (
        SELECT * FROM users
        %PARTITION_PREDICATES%
        %NON_PARTITION_PREDICATES%

        UNION ALL 

        SELECT * FROM user_changes
        %PARTITION_PREDICATES%

        QUALIFY ROW_NUMBER() OVER(
            PARTITION BY id 
            ORDER BY last_updated_at DESC
        ) = 1
    )
    %PARTITION_PREDICATES%
    %NON_PARTITION_PREDICATES%
)

SELECT * FROM users_view
WHERE account_id = 1234 AND city = 'Chicago'

Jakieś szalone pomysły?

1

Najlepsza odpowiedź

1

można dodać dodatkową kolumnę src w celu określenia tabeli źródłowej i predykatów migracji w PRZYPADKU:

select * from
(
SELECT u.*, 'users' as src FROM users u
union all
SELECT uc.*, 'users_changes' as src FROM users_changes uc
) 
WHERE --applied only to users
      case when src  = 'users' 
                 then city = 'Chicago' --predicate wrapped in case
           else true
       end
  --applied to all
  AND account=12345 
2021-11-23 14:58:40

Bardzo fajny pomysł! Dziękuję!
micah

@micah można zakończyć wszystkie predykaty w jeden REJESTR, korzystając z I lub LUB: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................