Unterschiedliche Ergebnisse bei "gleichen" Abfragen

Hallo PostgreSQL Forum!
Ich habe erst seit kurzem mit SQL zu tun, versuche mir die Abfragesprache aber so gut wie möglich beizubringen. Jetzt bin ich aber auf folgendes Problem gestoßen, dass ich mir selbst nicht erklären kann.
Ich habe für eine Abfrage 2 verschiedenen Lösungswege gefunden, die meiner Meinung nach eigentlich dasselbe Ergebnis liefern sollten. Dies tun sie aber nicht. Die Ergebnis Anzahl ist um einen geringen Wert unterschiedlich. Bei Variante 1 bekomme ich geringfügig weniger Ergebnisse als bei Variante 2.
Ich glaube es liegt an dem Left Join. Wenn ich den durch einen Join ersetze bekomme ich für beide Varianten dasselbe Ergebnis (die geringere Anzahl).
Unten sind die beiden Abfrage Varianten zu finden.
Es würde mich sehr freuen, wenn ihr mir weiterhelfen könnten. Ich würde gerne verstehen wieso es dabei zu unterschiedlichen Ergebnissen kommt und welche Abfrage geeigneter ist.

Variante 1

select 
a.haus_id as haus_id,
a.id as angebot_id,
a.nutzung as nutzung,
a.mit_plan

from angebot a
left join haus h
on h.id=a.haus_id

where (a.nutzung like '%Geschäft%' or a.nutzung like '%geschäft%')
and a.status = 1
and (a.mit_plan = FALSE or a.mit_plan is null)

and h.status_id <> 1
and h.status_id <> 2
and h.status_id <> 3

order by a.haus_id, a.id

Variante 2

select 
a.haus_id as haus_id,
a.id as angebot_id,
a.nutzung as nutzung,
a.mit_plan

from angebot a

left join 
( 	select distinct (h.id)

	from haus h

	where 
	h.status_id <> 1
	and h.status_id <> 7
	and h.status_id <> 8
)h1

on h1.id=a.haus_id

where (a.nutzung like '%Geschäft%' or a.nutzung like '%geschäft%')
and a.status = 1
and (a.mit_plan = FALSE or a.mit_plan is null)

order by a.haus_id, a.id

Die Bedingung im WHERE für die Tabelle haus des ersten Statements macht aus dem outer join wieder einen inner join (weil damit alle NULL Werte die durch den outer join “reinkommen” wieder rausgeschmissen werden).
Du musst die Bedingungen in die JOIN Bedingung verschieben:

select 
  a.haus_id as haus_id,
  a.id as angebot_id,
  a.nutzung as nutzung,
  a.mit_plan
from angebot a
  left join haus h on h.id=a.haus_id
                  and h.status_id <> 1
                  and h.status_id <> 2
                  and h.status_id <> 3
where (a.nutzung like '%Geschäft%' or a.nutzung like '%geschäft%')
  and a.status = 1
  and (a.mit_plan = FALSE or a.mit_plan is null)
order by a.haus_id, a.id

Vielen Dank für die schnelle Antwort. Mit der Methode komme ich dann wieder auf das Ergebnis der Variante 2.
Ich habe jetzt die Ergebnisse Fall für Fall verglichen. In Variante 2 und in deiner Variante sind auch Fälle vorhanden, die dem Statement: and h.status_id <> 1 nicht entsprechen. Also die h.status_id = 1 haben.
Wieso ist das so? Ich hätte gedacht diese Fälle fallen durch diese and h.status_id <> 1 Bedingung weg?
Für meine Verwendung sollte Variante 1 soweit stimmen. Aber trotzdem verwirrt mich da die vorgangsweise von SQL.

Schwer zu sagen ohne Beispieldaten, klingt aber sehr unwahrscheinlich.
Aber in dem Statement wird h.status_id überhaupt nicht ausgegeben. Wie siehst Du dann, dass da welche mit dem Status 1 dabei sind? status_id sollte NULL sein für diese Angebote.

Online Beispiel: https://dbfiddle.uk/?rdbms=postgres_12&fiddle=507f4a18df1d0b9711c622dec60c5b2f

Die Datenbank für die ich Abfrage mache ist auch mit einer Website verbunden auf der jedes Haus eine eigene Seite hat. Dort kann ich den Status der einzelnen Fälle im Nachhinein durchgehen. Der Status kann nur nie Null sein, weil das die Voraussetzung ist, damit ein Haus überhaupt in der Datenbank gespeichert wird.
Bei Variante 1 erhalte ich 186 Fälle und bei Variante 2 190 Ergebnisse. Diese habe ich dann in Excel miteinander vergleichen und mir die 4 Fälle genauer angeschaut. Die hatten alle die h.status_id = 1.
Ich vermute es hat etwas mit dem Angebot Status (a.status = 1) zu tun. Dort gibt es den Status 1 oder 0. Und wenn dieser auf 1 ist, bekomme ich diesen Fall mit Variante 2 auch. Kann das sein?
Ich habe diesen Fall jetzt auch in dem dbfiddle ausgeben lassen.
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=49ad76fc7a057f9516b2f02211b9e6f4

Ok ja danke. Das macht dann irgendwie Sinn. Die können ja keine Werte erhalten weil sie im dem outer join nicht angefügt wurden (bzw. nur als ist null angefügt wurden).
Das sind dann aber die Fälle die ich eigentlich auch nicht will. Die würde ich dann mit einem zusätzlichen and h.id is not null auch wegbekommen und dann bin ich wieder bei dem Ergebnis von Variante 1 und dadurch ergeben dann beide Abfragen dasselbe.

Danke aufjedenfall für deine Mühe und Zeit.

Dann willst Du gar keinen outer join, sondern einen inner join.
Dann ist es auch egal ob das h.status_id <> 1 im WHERE oder in der JOIN Bedingung steht.