SQL SELECT 返回两个属性
SQL SELECT IN returning two attributes
我正在努力更好地理解 SELECT IN。这是一个有效的查询吗?
SELECT name
FROM products
WHERE product_id IN
(SELECT product_id, SUM(unit_price)
FROM sales
GROUP BY product_id
HAVING (SUM(unit_price) > 200));
Select
inside In
不能有 2 列。这将引发错误。但是由于您要查找的产品 ID 无论如何都不需要 SUM(Unit_Price)
,因此下面的查询应该可以正常工作:
SELECT name FROM products WHERE product_id IN (SELECT product_id FROM sales GROUP BY product_id HAVING (SUM(unit_price) > 200));
如果您想避免 IN
部分,也可以使用内部联接。
不,出于同样的原因,这不是一个有效的谓词:
WHERE product_id = (1234, 16)
比较一个标量等于一个元组是没有意义的。
请注意 SQL 确实允许您将元组与元组进行比较:
WHERE (product_id, 16) = (1234, 16)
但是两个元组中的元素个数必须相同
同样,您可以将元组与 returns 元组的子查询进行比较:
WHERE (product_id, 16) IN (SELECT product_id, SUM(unit_price) FROM ...
只要两个元组的元素数量相同。
您可以使用公用表表达式 (CTE) 来实现
;WITH CTE(ProductId, UnitPrice)
AS(
SELECT product_id, SUM(unit_price)
FROM sales
GROUP BY product_id
HAVING (SUM(unit_price) > 200))
SELECT [Name], c.UnitPrice
FROM Products p INNER JOIN CTE c on p.Product_Id = c.ProductId
我正在努力更好地理解 SELECT IN。这是一个有效的查询吗?
SELECT name
FROM products
WHERE product_id IN
(SELECT product_id, SUM(unit_price)
FROM sales
GROUP BY product_id
HAVING (SUM(unit_price) > 200));
Select
inside In
不能有 2 列。这将引发错误。但是由于您要查找的产品 ID 无论如何都不需要 SUM(Unit_Price)
,因此下面的查询应该可以正常工作:
SELECT name FROM products WHERE product_id IN (SELECT product_id FROM sales GROUP BY product_id HAVING (SUM(unit_price) > 200));
如果您想避免 IN
部分,也可以使用内部联接。
不,出于同样的原因,这不是一个有效的谓词:
WHERE product_id = (1234, 16)
比较一个标量等于一个元组是没有意义的。
请注意 SQL 确实允许您将元组与元组进行比较:
WHERE (product_id, 16) = (1234, 16)
但是两个元组中的元素个数必须相同
同样,您可以将元组与 returns 元组的子查询进行比较:
WHERE (product_id, 16) IN (SELECT product_id, SUM(unit_price) FROM ...
只要两个元组的元素数量相同。
您可以使用公用表表达式 (CTE) 来实现
;WITH CTE(ProductId, UnitPrice)
AS(
SELECT product_id, SUM(unit_price)
FROM sales
GROUP BY product_id
HAVING (SUM(unit_price) > 200))
SELECT [Name], c.UnitPrice
FROM Products p INNER JOIN CTE c on p.Product_Id = c.ProductId