使用子查询来连接两个表中的列

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;

以上是关于使用子查询来连接两个表中的列的主要内容,如果未能解决你的问题,请参考以下文章

SQL多表链接查询、嵌入SELECT语句的子查询技术

MySQL 子查询

BigQuery 避免多个子查询

Oracle_SQL 连接和子查询

mysql连接查询和子查询

数据库子查询 ---where或having后面----列子查询-多行子查询