带有“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 1
或 SELECT 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
中的一行 EXISTS
和 supplierID
等于 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”子句的子查询,其中需要从两个表中收集信息的主要内容,如果未能解决你的问题,请参考以下文章