2016-04-21 10 views
0

Ich habe eine Tabelle TableA mit Spalten [AccountID, Email]. Ich habe eine andere Tabelle TableB mit [AccountID_1, AccountID_2, email]. Ich muss die AccountID in TableA mit einem der AccountIDs in TableB übereinstimmen. Keiner dieser Ansätze scheint zu funktionieren. Der erste scheint zu stagnieren oder dauert ewig (beide Tabellen haben mehrere hunderttausend Einträge). Der zweite der Fehler mit "Can't reopen table: TableB".MySQL UNION vs JOIN mit OR in Klausel

Versuch JOIN oder

select count(distinct TableA.id) from TableA 
    JOIN TableB ON TableB.AccountID = TableA.AccountID_1 
    OR TableB.AccountID = TableA.AccountID_2 
; 

SQL-UNION

select count(distinct b.id) from (
    select * from TableA 
    join TableB on TableB.AccountID = TableA.AccountID_1 
    union 
    select * from TableA 
    join TableB on TableB.AccountID = TableA.AccountID_2 
) as b; 
+0

Auf der Gewerkschaft versucht Sie zu sagen vergessen, 'verbinden TableB auf TableB.AccountID ...' die Beim zweiten Mal gibt es einen Fehler. –

+0

Sorry, das war nur ein Fehler beim Versetzen meiner Anfrage in SO. Ich habe es korrigiert. – Asif

+0

Gibt es Indizes für alle 3 'AccountID' * Spalten? Haben Sie 'explain' in der 'join'-Abfrage ausgeführt, um zu sehen, welche Indizes verwendet werden oder nicht? –

Antwort

0

Der Versuch, Sie könnten versuchen,

select count(*) from TableA where 
exists (select 1 from TableB where 
AccountID in (AccountID_1,AccountID_2)) 
0

Für die erste, wobei der Spaltenname ausgewählt ist falsch. Die folgenden scheinen gut zu funktionieren.

Versuch JOIN mit OR:

select count(distinct `TableA`.AccountID) from `TableA` 
    JOIN TableB ON (TableA.AccountID = TableB.AccountID_1 
     OR TableA.AccountID = TableB.AccountID_2); 

Der Versuch, SQL UNION

select count(distinct b.AccountID) from (
    select `AccountID` from TableA 
    join TableB on TableA.AccountID = TableB.AccountID_1 
    union 
    select `AccountID` from TableA 
    join TableB on TableA.AccountID = TableB.AccountID_2 
) as b;