Wpis z mikrobloga

Mam problem natury SQLowej. Chcę wrzucać rekordy do TABELAA z TABELIB ale nie chce w tabeli TABELA_A powtórzeń. Obie tabele nie są ze sobą powiązane w żaden sposób. O tym czy jest to powtarzalny rekord decydują tylko 3 kolummy. Poszukuje jakiegoś wydajnego rozwiązania bo tabele są duże.

#sql #programowanie #bazydanych
  • 12
  • Odpowiedz
@n1troo: select into tylko w przypadku jak tabela nie istnieje. Ale skoro mówisz o niej to znaczy, że istnieje więc poniższe zadziała

insert into TABELAA
select distinct a, b, c
from TABELAB
  • Odpowiedz
@thomekh: ale to wydaje mi się bardzo obciążające. Wolałbym robić inserta i nie zaważać na errory.
Jest ta opcja indexowa zeby ignorował duplikaty ale nie wiem jak to uruchomić, to było by najlepsze
  • Odpowiedz
konto usunięte via Wykop Mobilny (Android)
  • 0
@n1troo: możesz użyć funkcji row_number z PARTITION BY na kolumny a,b,c który wrzuci duplikaty do "jednego worka". Na końcu dasz warunek żeby brać tylko jeden wiersz z każdego worka i będzie git :) Wtedy wszystko ograsz jednym insertem
Aczkolwiek pomysł @thomekh jest jak najbardziej ok. Posługiwanie się tempowymi tabelkami jest częstą i dobrą praktyką
  • Odpowiedz
@n1troo:
Distinct jest podobno bardziej wymagający niż Group By. Ja bym założył unique index na tych trzech unikatowych kolumnach, wybierał z B group By i dodał left join aby sprawdzić, czy nie ma rekordów w A.

Czyli:
select TableB.a, TableB.b, TableB.c from TableB left join TableA on TableA.a = TableB.a and TableA.b = TableB.b and TableA.c = TableB.c
where TableA.a is null
group by TableB.a, TableB.b, TableB.c

Ale to samo zadziała
  • Odpowiedz