2016-04-09 7 views
0

Kann jemand überprüfen, ob meine Abfrage die beabsichtigten Ergebnisse produziert, die ich hoffe?Joining 3 Tables Inner & Left

Ich benutze PostgreSQL.

SELECT sold_at 
, quantity 
, returned_at 
, name 
, price 
FROM sales 
LEFT JOIN returns 
ON sales.order_id=returns.order_id 
JOIN products 
ON sales.product_id=products.product_id 
WHERE name LIKE '%sock%' 
ORDER by sold_at ASC 
sold_at | quantity | returned_at | name | price 

2015-06-01 | 8 | |socks-toeless | 15 
2015-06-01 | 7 | 2015-06-08| socks-flat | 15 

Mein Ziel ist es für die Ausgabe all Socken Käufe aus dem Verkaufstisch (unabhängig davon, ob es zurückgegeben wurde), und eine Spalte, die zeigt, ob die Socke Reihenfolge zurückgegeben wurde Das Feld enthält ein Datum, wenn es zurückgegeben wurde, und ist leer, wenn das Element nicht zurückgegeben wurde.

Der Name des Produkts (z. B. "Socke") stammt aus der Produkttabelle.

+0

Welche Datenbank verwenden Sie? Sie müssen möglicherweise nur "LINKE VERBINDUNG" in "LINKE AUSSERJOIN" ändern. –

+0

Ich benutze PostgreSQL – am340

+0

Dann OUTER ist impliziert, so denke ich, Ihre Anfrage ist in Ordnung. Funktioniert es nicht so, wie du es erwartest? –

Antwort

0

Ja, Ihre Abfrage sieht aus wie es sollte wie vorgesehen.

+0

Danke! Wie würde ich bei Postgres nur das Datum aus einer Datetime-Variable auswählen? Ich habe es manuell oben gelöscht, aber das DATETIME enthält tatsächlich Stunden Minuten Sekunden. – am340

+0

Eine einfache Umwandlung zu einem "Datum" funktioniert: http://stackoverflow.com/questions/6133107/extract-date-yyyy-mm-dd-from-a-timestamp-in-postgresql Je nachdem, was Sie wollen, Sie kann auch PostgreSQL-Funktionen wie "extract" oder "date_trunc" verwenden. –

0

Ihre Frage beschreibt nicht, wie die Tabellen aussehen. Ich würde erwarten, dass die returns Tabelle das Produkt aufzunehmen, so würde ich eine Abfrage antizipieren, die mehr wie folgt aussieht:

SELECT s.*, p.name, 
     (case when r.product_id is null then 0 else 1 end) as IsReturnFlag 
FROM sales s JOIN 
    products p 
    ON s.product_id = p.product_id LEFT JOIN 
    returns r 
    ON s.order_id = r.order_id AND 
     s.product_id = r.product_id 
WHERE p.name LIKE '%sock%'; 
+0

* Verkaufstisch - sold_at, order_id, product_id, Menge, user_id * Produkte Tabelle - product_id, Name, Preis * Gibt Tisch - returned_at, ORDER_ID – am340

+0

@ am340. . . Woher wissen Sie, welches Produkt zurückgegeben wurde, wenn die Bestellung mehrere Produkte enthält? –