2017-11-09 5 views
0

Wie kann ich zwei Tabellen auf beiden Wert verbinden?SQL Join auf zwei Tabellen

select cases.* 
from client_cases 
inner join cases on client_cases.id = cases.timeline 
left join customers on client_cases.customer_id = customers.id or customers.email = '[email protected]' 
where cases.timeline in (
    select timeline from cases where cases.payload -> 'person' ->> 'phone' ~ '4625152' 
) 

Ich versuche, um ein Ergebnis zu erhalten, wenn entweder customers.email = ‚[email protected]‘ oder wenn das cases.payload JSONB Telefonfeld hat den Wert ‚4625152‘

Die obige Abfrage gibt nur ein Ergebnis zurück, wenn die Telefonnummer eine Übereinstimmung hat. Nicht, wenn die E-Mail eine Übereinstimmung hat und die Telefonnummer nicht.

+0

hatte Sollte nicht 'customers.email =‚test @ sein gmail.com'' in die 'WHERE'-Klausel? – Eric

+0

Ich habe Angst, dass nur das Problem umkehrt, dann bekomme ich ein Ergebnis nur, wenn die E-Mail eine Übereinstimmung hat, aber nicht die Telefonnummer. – n83

+0

Es wird alle von ihnen bekommen. Es ist eine ODER-Bedingung. – Eric

Antwort

2

Ich denke, es macht mehr Sinn, E-Mail-Bedingung in WHERE-Klausel zu setzen.

select cases.* 
from client_cases 
inner join cases on client_cases.id = cases.timeline 
left join customers on client_cases.customer_id = customers.id 
where cases.timeline in (
    select timeline from cases where cases.payload -> 'person' ->> 'phone' ~ '4625152' 
) or customers.email = '[email protected]' 
+0

Ich muss dich missverstanden haben, das hat perfekt funktioniert! – n83

0

Die on-Klausel verwendet wird, wenn die join für passende Zeilen suchen. Die Klausel where wird verwendet, um Zeilen zu filtern, nachdem alle Verbindungen durchgeführt wurden.

Sie haben die mit customers.email = '[email protected]' beitreten zu tun, aber Sie filtern, dass mit WHERE case.timeline IN.. .. Das ist das Ergebnis erklären Sie

SELECT cases.* 
FROM client_cases 
INNER JOIN cases ON (client_cases.id = cases.timeline) 
LEFT JOIN customers ON (client_cases.customer_id = customers.id) 
WHERE cases.timeline IN (
    SELECT timeline 
    FROM cases 
    WHERE cases.payload -> 'person' ->> 'phone' ~ '4625152' 
) OR customers.email = '[email protected]'