2016-07-25 12 views
0
apps: 
id  name 
--  -------- 
1  Facebook 
2  Twitter 
3  Pokemon 


markets: 
id  app_id code 
--  ------ ---- 
1  1   US 
2  1   CA 
3  3   CA 

Die folgende Abfrage wird die Apps für die USA erhalten:Wie schreibe ich eine SQL-Abfrage, um die Datensätze zu erhalten, wenn es eine Übereinstimmung gibt oder wenn es keine Übereinstimmungen in der zweiten Tabelle gibt?

SELECT * 

    FROM apps 

    INNER JOIN markets 
    ON markets.app_id = apps.id 
    AND markets.code = 'US' 

Aber wie man die oben genannten Aufzeichnungen, sowie alle Anwendungen, die keine Märkte haben?

Die Abfrage zurückkehren würde apps 1 und 2.

PostgreSQL 9.3.5, 9.3.9 und 9.4.7

Antwort

2

Hier ist eine Option mit einem outer join:

select * 
from apps 
    left join markets 
     on markets.app_id = apps.id 
where markets.app_id is null or 
    markets.code = 'US' 
+0

Es funktioniert. Ist 'markets.id 'gleichwertig? –

+0

@BSeven - ja, es ist gleichwertig. Der Schlüssel besteht darin, die "Null" -Prüfung aus der Tabelle "Märkte" durchzuführen, unabhängig davon, welches Feld geprüft wird. – sgeddes

1

Als eine Anmerkung, die Sie nicht tun scheinen wollen, Informationen über Apps, so könnten Sie tun:

select a.* 
from apps a 
where not exists (select 1 from markets m where m.app_id = a.id) or 
     exists (select 1 from markets m where m.app_id = a.id and m.code = 'US'); 
Verwandte Themen