【问题标题】:Pulling 2 independent queries and then combined into one subquery in SQL Server提取 2 个独立查询,然后在 SQL Server 中合并为一个子查询
【发布时间】:2018-12-02 07:34:57
【问题描述】:

[在此处输入图片描述]示例数据集 enter image description here

2我的问题涉及提出 2 个独立的查询。首先,我需要拉出所有商店中包含的产品。第二个查询是收集所有产品并列出可用的尺寸。完成 2 个查询后,我可以将它们组合成一个子查询。我正在运行 SQL Server。

到目前为止,我得到了第一部分,在那里我能够获得所有商店中可用产品的产品 ID。这仅输出产品 ID,然后我的策略是使用外部查询来评估它们并将其与尺寸表连接。

SELECT product_id
FROM Sells
GROUP BY product_id
HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location);

我现在正试图让第二个查询进行尺寸。谁能指出我错过了什么?我收到显示可用_in 的错误。无法绑定产品 ID。

我添加了 ERD 以澄清表格。我假设我必须将 Product 与 Available_in 之间的表连接起来,并将 available_in 连接到 Sizes。我正在尝试输出名称、尺寸选项、product_id

【问题讨论】:

  • 分享样本数据和预期输出
  • 不清楚你在问什么。请显示示例输入和输出。
  • 所以第一个独立查询会拉入一个输出,显示每个商店都可用的 product_id,我这样做了。它将提取 101 和 103 的 product_id。第二个查询应该提取 size_option 列和 product_id 列。通过子查询组合两个查询后,外部查询应该是大小选项。子查询将是我为提取 product_id 而创建的子查询

标签: sql sql-server subquery correlated-subquery


【解决方案1】:

基于您只想知道如何加入两个查询的问题?

我对您的第二个查询表列表(Sizes、Available_in、Sells)进行了一些更改,我删除了“Available_in、Sells”,因为它们在放置时代表交叉连接。

我也避免解释在不知道表的实际上下文的情况下提供的查询。然而,为了清楚起见,查询要求:

唯一产品 ID 列表,其中销售该产品的商店位置数量与商店位置表中的商店数量相匹配,即该产品在所有商店中的销售位置。

SELECT size_option, available_in.product_id, product.product_name
FROM Sizes
JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id
JOIN Product ON Product.product_id = Available_in.product_id

根据您使用的 SQL Server 版本,有多种方法可以做到这一点。SQL Server 2005 中引入了公用表表达式 (CTE)。下面列出了两个示例。

2005 年之前的 SQL Server

SELECT size_option, available_in.product_id, product.product_name
FROM Sizes
JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id
JOIN Product ON Product.product_id = Available_in.product_id

WHERE product.product_id in (
   SELECT product_id
   FROM Sells
   GROUP BY product_id
   HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location)

)

SQL Server 2005 及更高版本

WITH ProductIDList as (
   SELECT product_id
   FROM Sells
   GROUP BY product_id
   HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location)

)
, ProductInfo as (
   SELECT size_option, available_in.product_id, product.product_name
   FROM Sizes
   JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id
   JOIN Product ON Product.product_id = Available_in.product_id

)
SELECT *
FROM ProductInfo 
JOIN ProductIDList ON ProductInfo.product_id = ProductIDList.product_id

【讨论】:

  • 如果我想在 FROM 子句中使用子查询,跳过 WHERE 子句,我将如何格式化它。
  • SELECT size_option, available_in.product_id, product.product_name FROM Sizes JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id JOIN Product ON Product.product_id = Available_in.product_id JOIN ( SELECT product_id FROM Sells GROUP BY product_id HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location) ) 作为 ProdIDs ON ProdIDs.product_id = Product.product_id
【解决方案2】:

我只想JOIN 他们在一起。学习使用正确、明确、标准 JOIN 语法。 永远不要FROM 子句中使用逗号。

select s.size_option, ai.product_id, p.product_name
from Sizes s join
     available_in ai
     on ai.sizes_id = s.sizes_id join
     Product p
     on p.product_id = ai.product_id join
     (select se.product_id
      from sells se
      group by se.product_id
      having count(se.store_location_id) = (select count(*) from store_location
     ) se
     on se.product_id = p.product_id;

您会注意到,这还包括表别名,这使查询更易于编写和阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多