2016-04-09 10 views
0

Mit postgresql, muss ich eine Ansicht erstellen ‚no_cat_customers‘ genannt, die den Vornamen, den Nachnamen eines Kunden gibt, die jede Ausgabe des Buches nicht ‚Die Katze im Hut namens versendet wurde ". Dies sollte unter Verwendung einer universellen Quantifizierung erfolgen. Der Fehler, den ich bekomme, ist - "FEHLER: EXCEPT Typen Integer und Text kann nicht angepasst werden" in Bezug auf Zeile 7().SQL - Nested Sub-Abfragen

CREATE VIEW no_cat_customers(customer_first_name, customer_last_name) 
AS SELECT first_name, last_name 
FROM customers 
WHERE EXISTS (SELECT c_id 
       FROM shipments 
       WHERE customers.c_id = shipments.c_id 
       EXCEPT (SELECT shipments.isbn 
         FROM books, editions, shipments 
         WHERE books.book_id = editions.book_id AND 
         editions.isbn = shipments.isbn AND 
         title LIKE '%The Cat in the Hat%')); 

Ich verstehe, dass diese schwer zu fragen, ist, dass Sie die Datenbank mit diesem Ich verwende, aber jede Hilfe würde nicht haben angesichts sehr geschätzt!

EDIT: Ich sollte hinzufügen, dass es zwei Ausgaben von 'The Cat in the Hat' in der Datenbank, beide mit unterschiedlichen isbn ist. Das muss also berücksichtigt werden.

+0

Muss * noch andere * Sendungen-> Artikel an diese Kunden geliefert worden sein? – wildplasser

+0

@wildplasser nein, sie müssen nur auf der Kundenliste sein und nicht die Katze in den Hut bekommen – Brittany

+0

In diesem Fall können Sie tun, nur mit 'wählen * von Kunden c wo nicht existiert (wählen * aus Sendungen s beitreten Bücher ON. .JOIN Editionen e ON ... WHERE c.cid = s.cid und b.title LIKE '% cat%'); '- >> Sie wollen ALLE Kunden, die das bestimmte Buch NICHT bestellt haben" – wildplasser

Antwort

2

Verwenden explizite JOIN Syntax statt es mit realen Bedingungen in where-Klausel zu vermischen. Ich glaube, dass dies funktionieren sollte:

CREATE VIEW no_cat_customers(customer_first_name, customer_last_name) AS 
SELECT first_name, last_name 
FROM customers c 
WHERE NOT EXISTS (
    SELECT 1 
    FROM shipments s 
    JOIN editions e ON s.isbn = e.isbn 
    JOIN books b ON b.book_id = e.book_id 
    WHERE b.title ILIKE '%The Cat in the Hat%' 
    AND c.c_id = s.c_id 
) 

Wenn Sie Datentyp Fehler haben, werfen Sie Ihre Spalten entsprechenden Typen, bevor sie zu vergleichen.

+0

ich habe anpassen = ‚% die Katze im Hut%‘ b.title. Aber leider sind gerade die ganze Brauch er list – Brittany

+0

ILIKE anstelle von = hinzufügen –