SQL - 嵌套子查询

时间:2016-04-09 12:01:43

标签: sql postgresql exists sql-view

使用postgresql,我必须创建一个名为' no_cat_customers'返回名字的任何客户的名字,姓氏,以及“帽子里的猫”这本书的任何版本。这应该使用通用量化来完成。我得到的错误是 - " ERROR:EXCEPT类型整数和文本无法匹配"参考第7行(EXCEPT (SELECT shipments.isbn)。

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%'));

我知道如果您没有使用我所使用的数据库,这很难提出,但对此有任何帮助将非常感激!

编辑:我应该补充说,有两个版本的“帽子里的猫”和#39;在数据库中,两者都有不同的isbn's。所以必须考虑到这一点。

1 个答案:

答案 0 :(得分:2)

使用显式JOIN语法,而不是将其与where子句中的实际条件混合使用。我相信这应该有效:

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
  )

如果您有数据类型错误,请在比较之前将列转换为适当的类型。