it-swarm.com.de

Verbinden Sie mehrere Spalten mit OR

Ich habe eine Tabelle mit 1 Million Datensätzen, um mich einer anderen Tabelle mit 100000 Datensätzen anzuschließen. Es gibt jedoch 5 potenzielle Schlüssel (nehmen wir an, Kontonummer, E-Mail-Adresse, Mitgliedsnummer, alternative E-Mail-Adresse und ID-Nummer) in Tabelle 1 und 60 Spalten () in Tabelle 2, die als Verbindungsschlüssel verwendet werden müssen. Mein Code wäre also ungefähr so:

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 OR 
t1.col1 = t2.col2 OR
t1.col1 = t2.col3 OR
...
t1.col5 = t2.col1 

und so weiter. Die Kombination von 5 und 60 ist riesig und tötet den Server. Es klingt auch nicht logisch. Ich dachte daran, 60 Spalten als Zeile einzufügen und die Anzahl der Datensätze zu erhöhen, um die Anzahl der Spalten zu verringern. Ich bin mir jedoch noch nicht sicher, ob dies die beste Lösung ist. Jede Lösung, die den Server nicht tötet, wird sehr geschätzt.

Hinweis : Bitte beachten Sie, dass jede Spalte von tb1 mit 10-15 Spalten in tbl2 abgeglichen werden soll. Beispielsweise wird die Spalte col1, Die "Kontonummer" enthält, mit col1-10 Verbunden, die alle potenziellen "Kontonummern" enthält. col1 Ist in keiner Weise mit einer E-Mail-Adresse oder anderen Spalten verbunden.

4
Espanta

Ich denke, Sie sollten das Setup ändern, aber Sie könnten den UNION-Ansatz ausprobieren.

Anstatt mehrere OR Verknüpfungen) zu erstellen, können Sie bestimmte Abfragen pro Fall durchführen und diese dann UNIONEN. Anschließend haben Sie die Möglichkeit, für jede einzelne Abfrage Indizes zu verwenden.

Also so etwas wie

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 

UNION 

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col2

.....

UNION 

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col5 = t2.col1

und so weiter.....

Dabei würde ich auch in Betracht ziehen, anstelle von * nur den Schlüssel aus der Tabelle auszuwählen. und in eine temporäre Struktur. Wählen Sie daraus den Schlüssel aus und verbinden Sie ihn mit Ihren Daten, damit Sie die Größe jedes einzelnen Index für die UNION-Abfragen minimieren können.

(Aber - Sie sollten ernsthaft darüber nachdenken, die Struktur meiner Ansicht nach zu ändern)

6
Allan S. Hansen

Ich glaube nicht, dass es eine Möglichkeit gibt, diese Abfrage zu einer guten Leistung zu bringen, aber der Code ist leichter zu lesen, wenn Sie das Prädikat IN verwenden:

select * 
from tbl1 t1 
join tbl2 t2 
    on t1.col1 in (t2.col1, t2.col2, ...) 
    or ...
    or t1.col5 in (t2.col1, ... )
7
Lennart