SQL - 嵌套子查询

Posted

技术标签:

【中文标题】SQL - 嵌套子查询【英文标题】:SQL - Nested Sub-Queries 【发布时间】:2016-04-09 12:01:43 【问题描述】:

使用 postgresql,我必须创建一个名为“no_cat_customers”的视图,该视图返回任何尚未发货任何版本的名为“The Cat in the Hat”的客户的名字、姓氏。这应该使用通用量化来完成。我得到的错误是 - “错误:除了类型整数和文本无法匹配”参考第 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%'));

我知道,考虑到您没有我正在使用的数据库,这很难问,但非常感谢您提供任何帮助!

编辑:我应该补充一点,数据库中有两个版本的“戴帽子的猫”,两个版本都有不同的 isbn。所以必须考虑到这一点。

【问题讨论】:

必须任何其他货件->物品已交付给这些客户吗? @wildplasser 不,他们只需要在客户名单上,而不是收到帽子里的猫 在这种情况下,您只能使用 select * from customers c where not exists(select * from shipments s join books ON .. JOIN editions e ON ... WHERE c.cid = s.cid and b.title LIKE '%cat%' ); -->> 您希望所有没有订购该特定书籍的客户" @wildplasser 谢谢大家,但有人告诉我必须使用包含“多个”其他子查询的查询,但这只包含一个 @Brittany 任务限制以这种方式非常惊人。在其上添加另一个选择 * 层,然后就可以了,多个子查询:-)。 【参考方案1】:

使用明确的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
  )

如果您有数据类型错误,请将列转换为适当的类型,然后再进行比较。

【讨论】:

我确实必须适应 b.title = '%The Cat in the Hat%'。但不幸的是,这只是返回了整个客户列表 添加 ILIKE 而不是 =

以上是关于SQL - 嵌套子查询的主要内容,如果未能解决你的问题,请参考以下文章

关于SQL DELETE嵌套子查询问题

子查询(嵌套子查询)

SQL Server 之 子查询与嵌套查询

SQL嵌套子查询和相关子查询的执行过程有啥区别

SQL嵌套子查询和相关子查询的执行过程有啥区别

sql语句中where条件的嵌套子查询性能