2016-05-22 8 views

Antwort

3

Verwenden Sie not exists.

select count(*) 
from first_table f 
where not exists (select 1 from second_table s where s.infoid = f.id) 
0

Obwohl @ vkp die Antwort richtig ist, können Sie auch minus Ihr Problem lösen können -

select count(*) 
from (select id from first_table 
     minus 
     select infoid from second_table) 
1

Das ist, was für Outer-Joins sind (unter anderem):

SELECT COUNT(*) 
    FROM FIRST_TABLE t1 
    LEFT OUTER JOIN SECOND_TABLE t2 
    ON t2.INFOID = t1.ID 
    WHERE t2.ID IS NULL 

Da SECOND_TABLE.ID der Primärschlüssel ist, kann in der Tabelle NULL nicht NULL sein, und daher, wenn SECOND_TABLE.ID als NULL im Produkt des Outer Joins angezeigt wird, bedeutet dies, dass keine SECOND_TABLE-Zeile gefunden wurde.

Für zukünftige Referenz - ich schlage vor, dass Sie ID nicht als Spaltenname verwenden. Dies kann sehr verwirrend sein, wenn Sie 30 Tabellen haben, die alle ID als Primärschlüssel haben. Wenn Sie ID als primären Schlüsselnamen für alle Ihre Tabellen verwenden, bedeutet dies außerdem, dass alle Fremdschlüsselspalten einen anderen Namen als die Schlüsselspalte haben müssen, auf die sie sich beziehen. Dies führt wiederum zu Verwirrung. Stattdessen schlage ich vor, dass Sie ID_ + den Namen der Tabelle verwenden - daher könnte der Primärschlüssel auf FIRST_TABLE ID_FIRST_TABLE sein und der Primärschlüssel auf SECOND_TABLE könnte ID_SECOND_TABLE lauten. Auf diese Weise erhält jede Tabelle einen eindeutigen Primärschlüsselspaltennamen - und wenn Sie eine Spalte haben müssen, sagen wir SECOND_TABLE, die sich auf FIRST_TABLE bezieht, wäre der Spaltenname auf SECOND_TABLE ID_FIRST_TABLE, was sofort den Zweck verdeutlicht der Spalte ist und auf welche Tabelle es verweist. Nur ein Gedanke.

Viel Glück.

Verwandte Themen