在 SQL 服务器中拉取 2 个独立的查询,然后组合成一个子查询

Pulling 2 independent queries and then combined into one subquery in SQL Server

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

2我的问题涉及提出 2 个独立的查询。首先,我需要提取所有商店中包含的产品。第二个查询是收集所有产品并列出可用尺寸。一旦我进行了 2 个查询,我就可以将它们组合成一个子查询。我是 运行 SQL 服务器。

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

连接起来
SELECT product_id
FROM Sells
GROUP BY product_id
HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location);

我现在正在尝试获取有关尺寸的第二个查询。谁能指出我错过了什么?我收到一条错误消息,显示 available_in。无法绑定产品ID。

我添加了 ERD 以阐明 tables。我假设我必须在 Product 和 Available_in 之间加入 tables,并在 Sizes 中加入 available_in。我正在尝试输出名称、大小选项,product_id

根据问题,您只想知道如何加入两个查询?

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

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

A list of unique product ids where the number of store locations that product is sold in matches the number of stores in the store location table, that is where the product is being sold in all the stores.

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 服务器的版本,有几种方法可以做到这一点 SQL 服务器 2005 中引入了通用 Table 表达式 (CTE)。两个示例概述如下。

SQL 2005年以前的服务器

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

我只是 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;

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