使用子查询来连接两个表中的列
Posted
技术标签:
【中文标题】使用子查询来连接两个表中的列【英文标题】:using subquery in order to join columns from two tables 【发布时间】:2019-10-09 12:47:42 【问题描述】:我开始学习 SQL 有一些我不明白的地方
我想从 Production.products 中获取列 product_id 和 product_name 并将其与 Production.stocks 表中的 quantity 列连接起来 但我不想使用连接,而是想使用子查询。
这是我目前写的代码: 而且我不明白为什么它不起作用:(
SELECT P.product_id, P.product_name,(
SELECT S.quantity
FROM Production.stocks AS S
WHERE S.product_id = P.product_id)
FROM Production.products as P;
【问题讨论】:
“不工作”是什么意思? 我没有得到一个包含三列的表,而是得到了错误:子查询返回了超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。 这个内连接查询比嵌套查询更容易 是的,我知道,但我也想练习嵌套查询,我只是不明白我遇到的错误 错误告诉你问题,@micox2。返回数据集(本例中为 2+ 行)的子查询如何显示为标量值?JOIN
就是你在这里。否则我们需要消耗性样本数据和预期结果。
【参考方案1】:
首先,让我们澄清一个事实,即根本不建议使用子查询。仅出于您自己的研究原因才这样做;如果您考虑到性能或代码清晰,请使用简单连接。
当您通过将SELECT
子句括在括号中进行子查询时,您将结果强制为单个值。如果没有,您会收到收到的错误消息。
通常,子查询用在FROM
子句中,应该给它们一个名字,然后代表一个表。像这样:
SELECT P.product_id, P.product_name,S.quantity
FROM Production.products as P
inner join
(
SELECT quantity
FROM Production.stocks
) as S on S.product_id = P.product_id
您可以从子查询的简单性中看出它是多么的少用。
【讨论】:
【参考方案2】:您可以使用 SUM 关键字来防止错误并为您提供总数量。
SELECT P.product_id, P.product_name,(
SELECT SUM(S.quantity)
FROM Production.stocks AS S
WHERE S.product_id = P.product_id)
FROM Production.products as P;
【讨论】:
【参考方案3】:我认为根本不需要子查询。
如果产品是唯一的实体,那么就查询性能而言,连接到 stock 表并对数量进行求和肯定会更有益
SELECT
Production.Products.Product_id,
Production.Products.product_name,
SUM(Production.Stocks.quantity) AS Quantity
FROM
Production.Products
LEFT JOIN
Production.Stocks
ON
Production.Stocks.product_id = Production.Products.product_id
GROUP BY
Production.Products.product_id,
Production.Products.product_name
如果您需要它按商店报价库存数量,那么您需要在商店中添加一个附加连接并将商店添加到 select 和 group by 子句中,就像这样
SELECT
Production.Products.Product_id,
Production.Products.product_name,
Sales.Stores.store_name,
SUM(Production.Stocks.quantity) AS Quantity
FROM
Production.Products
LEFT JOIN
Production.Stocks
ON
Production.Stocks.product_id = Production.Products.product_id
LEFT JOIN
Sales.Stores
ON
Production.Stocks.store_id = Sales.Stores.store_id
GROUP BY
Production.Products.product_id,
Production.Products.product_name,
Sales.Stores.store_name
希望有帮助
【讨论】:
非常感谢 :) 确实不需要子查询,但我在视频中看到有人这样做并想玩它以了解我的理解程度 @michox2 一般来说,尽可能避免子查询,因为它们可能会成为性能噩梦。【参考方案4】:您的意思是从产品表中选择所有数据并显示每个产品的数量列吗?
SELECT P.product_id, P.product_name, isnull(s.quantity, 0) as Quantity
FROM Production.products as P
left join Production.stocks AS S
on p.product_id = S.product_id
如果您与 Products 和 Stocks 有一对多关系,您应该使用这样的子查询
SELECT P.product_id, P.product_name, isnull(s.quantity, 0) as Quantity
FROM Production.products as P
left join (
select product_id, sum(quantity) as Quantity
from Production.stocks
group by product_id)
as S on p.product_id = S.product_id
将生成数量字段的聚合总和值
【讨论】:
是的,这是我想要得到的最终结果,但使用嵌套查询而不是连接 :) @michox2 如果是这种情况,只需使用外部应用。 SELECT P.product_id, P.product_name,qty.quantity FROM Production.products as P OUTER APPLY (SELECT S.quantity FROM Production.stocks AS S WHERE S.product_id = P.product_id)qty;以上是关于使用子查询来连接两个表中的列的主要内容,如果未能解决你的问题,请参考以下文章