Sie haben das gewünschte Ergebnis geplant statt einer Unterabfrage auf diese Weise verbinden:
select B.id
from A right join B on A.ticket = B.id
where B.state not in (3, 4, 10) and B.disable = 0
group by B.id
having count(case when A.ticket is not null and A.type = 0 then 1 end) = 0;
auf diese Weise sind Sie nur unter Berücksichtigung der Reihen B, die eithe r haben keine übereinstimmende Zeile in A oder haben einige, aber keine mit A.type = 0
.
Falsche pre-edit Antwort
Ich würde gehen mit:
select B.*
from A right join B on A.ticket = B.id
where B.state not in (3, 4, 10) and B.disable = 0 and coalesce(A.type, 1) <> 0
Auf diese Weise können nur berücksichtigt werden die Zeilen, die entweder nicht beitreten oder beitreten, aber don Habe keine A.type = 0
.
Beachten Sie, dass je nach der von Ihnen verwendeten Datenbank die coalesce
-Funktion möglicherweise durch eine gleichwertige ersetzt werden muss.
Ich entfernte die inkompatiblen Datenbank-Tags. Bitte markieren Sie nur die von Ihnen verwendete Datenbank. –
Versuchen Sie, 'AND A.type <> 0 'zu Ihrem where hinzuzufügen – MohaMad
Können Sie erklären, warum Sie hier richtig Join wollen? Es ist wie 'wählen Sie nur optionale Daten von optionalen Daten richtig Join Haupttabelle '... – jarlh