【问题标题】: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 就是你在这里。否则我们需要消耗性样本数据和预期结果。

标签: sql sql-server tsql


【解决方案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;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多