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

时间:2019-07-08 15:46:09

标签: sql subquery exists

因此,有两个表。一个列出所有有关产品的信息(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与另一个表匹配的产品名称时,从何处收集公司名称?

2 个答案:

答案 0 :(得分:0)

实际上exists只关心是否返回行,而不关心该行中的值。因此,选择什么列没有区别。我通常只使用1

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

1易于键入。

答案 1 :(得分:0)

  

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

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

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

  

系统检测到所有具有单价的产品名称时>   100,并将SupplierID与其他表匹配,从哪里开始   收集公司的名字是什么?

声明是:

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

因此,当且仅当表Supplier中带有{{1}的行EXISTS时,公司名称才从表Product中收集。 }等于表supplierID的行的ID,并附加条件为Suppliers