Próbuję zaktualizować tabelę na podstawie dopasowania do innej tabeli dla wielu kolumn. Próbowałem, co pokazano poniżej, ale otrzymuję błąd. Jak się to zrobić?

update my_table set flag = '1' where (patient_id, org) in (
  select distinct (patient_id, org) from enc where lower(enc_type) like '%visit%'
)

Błąd:

Error in SQL statement: AnalysisException: IN/EXISTS predicate sub-queries can only be used in Filter/Join and a few commands: 'DeltaUpdateTable [post_partum#1911], [1], named_struct

--- EDYTOWAĆ------------------------------

Poniżej znajduje się pełny przykład aktualizacji tabeli w oparciu o złożone zapytanie, które działały na podstawie dokumentacji podanej w zaakceptowanej odpowiedzi.

MERGE INTO events eve
USING (
  select 
    enc.org as org,
    enc.person_id as person_id,
    min(encounter_date) as visit_day
  from 
    enc
    join events eve on enc.org = eve.org and enc.person_id = eve.person_id and eve.is_post_partum = 1
  where 
    lower(enc.enc_type) like '%visit%'
  group by 1, 2
) visits
ON eve.org = visits.org and eve.person_id = visits.person_id
WHEN MATCHED THEN
  UPDATE SET eve.delivery_date = visits.visit_day
;
1
John 28 październik 2020, 17:06

1 odpowiedź

Najlepsza odpowiedź

Po pierwsze, upewnij się, że używasz Delta Lake jako formatu tabeli. Po drugie, myślę, że szukasz upserts , które są zdefiniowany jako

Operacja, która wkłada wiersze do tabeli bazy danych, jeśli nie istnieją już, ani ich aktualizuje je, jeśli to robią.

Aby to zrobić, musisz użyć MERGE w połączeniu z UPDATE. Oto przykład z wyrażeniem dopasowania:

MERGE INTO events
USING updates
ON events.eventId = updates.eventId
WHEN MATCHED THEN
  UPDATE SET events.data = updates.data
WHEN NOT MATCHED
  THEN INSERT (date, eventId, data) VALUES (date, eventId, data)

Zobacz więcej w dokumentacji baz danych Tutaj .

2
Raphael K 30 październik 2020, 00:19