带有“Exists”子句的子查询,其中需要从两个表中收集信息

Posted

技术标签:

【中文标题】带有“Exists”子句的子查询,其中需要从两个表中收集信息【英文标题】:Subquery with a clause "Exists", where information need to be gathered from two tables 【发布时间】:2019-07-08 15:46:09 【问题描述】:

所以,有两张桌子。一种列出所有产品信息(ID、ProductName、SupplierID、UnitPrice、Package、IsDiscontinued),另一种存储有关供应商的信息(ID、CompanyName、ContactName、City、Country...) 我需要找到产品超过 100 美元的供应商。所以给出的代码如下:

SELECT CompanyName
FROM Supplier
WHERE EXISTS
( SELECT ProductName
FROM Product 
WHERE supplierID = supplier.ID
AND unitprice > 100);

我不明白为什么在子查询中我们需要选择 ProductName 而不是表 Product 中的任何其他字段?此外,当系统检测到所有单价 > 100 的产品名称且供应商 ID 与另一个表匹配时,它从哪里收集公司名称?

【问题讨论】:

你的 dbms 是什么?你能提供一些样本数据并期待结果吗? 我不明白为什么在子查询中我们需要选择 ProductName 而不是任何其他字段您可以选择任何其他列,甚至是所有列,甚至像 select 1... 这样的常量甚至为空:select null.... SELECT 1SELECT NULL 也可以。 SELECT 1/0 也可以正常工作。 在 Postgres 中,您甚至可以完全删除列列表,其中存在 (select from product ...) 也可以 【参考方案1】:

我不明白为什么在子查询中我们需要选择 ProductName 而不是 任何其他字段

您可以选择任何其他列,甚至是所有列,甚至是select 1... 甚至null 之类的常量:select null...

使用此子查询的目的是确保EXISTS 至少有一行具有其WHERE 子句中提供的属性。

当系统检测到所有带有单价的产品名称时> 100 并将供应商ID与另一张表匹配,从哪里做 收集一下公司的名称是什么?

声明是:

SELECT CompanyName
FROM Supplier
................

所以公司的名称当然是从表 Supplier 中收集的,当且仅当表 Product 中的一行 EXISTSsupplierID 等于 ID 的表Suppliers 中的行,附加条件为unitprice > 100

【讨论】:

【参考方案2】:

其实exists只关心是否返回行而不关心行中的值。因此,选择哪些列没有区别。我通常只使用1:

WHERE EXISTS (SELECT 1
              FROM Product
              WHERE supplierID = supplier.ID AND unitprice > 100
             )

1 易于输入。

【讨论】:

我一般用* ;) @a_horse_with_no_name 。 . .这需要我键盘上的 shift 键。

以上是关于带有“Exists”子句的子查询,其中需要从两个表中收集信息的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的子查询中FROM和EXISTS子句的使用教程

带有“exists”子句和多个表的 SQL 子查询

EXISTS 不适用于 WITH 子句中的子查询

SQL 中 EXISTS 与 NOT EXISTS

如何使用带有 Sequelize 的 EXISTS 子句进行查询?

两个表上的并集,其中一个带有 where 子句