2017-11-14 10 views
1

Ich habe derzeit 2 SQL-Tabellen: table1 und table2. table1 hat 2 Spalten namens id_a und column_a. table2 hat 2 Spalten namens id_b und column_b.So erstellen Sie eine Spalte in einer SQL-Tabelle, basierend auf Werten einer anderen Tabelle

Ich möchte eine new_column in table1 erstellen. Der Wert new_column sollte 1 sein, wenn der Wert table1.id_a in table2.id_b existiert. Andernfalls sollte den Wert 0 haben.

Wie mache ich das? Ich verwende SQLite3 und table1 ist deutlich größer als table2.

Antwort

1

Wie wäre es mit einem einfachen IN?

SELECT *, 
     id_a IN (SELECT id_b FROM table2) AS flag 
FROM table1; 
1

Wie wäre es mit einem einfachen exists?

select t1.*, 
     (case when exists (select 1 from table2 t2 where t2.id_b = t1.id_a) 
      then 1 else 0 
     end) as flag 
from table1 t1 
1

Eine left join Lösung für Spaß! Unter Umständen sogar effizienter als korrelierte Unterabfragen.

select 
    t1.*, 
    case 
     when t2.id_b is null then 0 
     else 1 
    end as new_column 
from 
    table1 t1 
left join 
    table2 t2 
    on t2.id_b = t1.id_a 
+0

Vielen Dank! Warum wäre die Verwendung von 'left join' effizienter als eine einfache' exist' in der Unterabfrage? – puifais

+1

Kein Problem! Es hängt vollständig von der Entscheidung des Optimierers ab, es überschreibt tatsächlich manchmal Unterabfragen als eine Verknüpfung. Der Perf Boost hat mit der Kardinalität des Tisches zu tun. Wobei die korrelierte Unterabfrage einmal für jede Zeile der Tabelle durchgeführt wird. Wie Sie sich vorstellen können, wächst mit dem Wachstum des Tisches auch die Leistung, die zur Ausführung der Abfrage benötigt wird. – pimbrouwers

+0

Und wenn mein 'table1' viel größer ist als' table2', wird der einfache 'exists'-Unterabfrage-Ansatz schneller ausgeführt? – puifais

Verwandte Themen