首页 > 解决方案 > 在 SQL Server 中提取 2 个独立查询,然后合并为一个子查询

问题描述

[在此处输入图像描述] 示例数据集 在此处输入图像描述

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

在此处输入图像描述

标签: sqlsql-serversubquerycorrelated-subquery

解决方案


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

我对您的第二个查询表列表(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

推荐阅读