拉取2个独立查询,然后组合到SQL Server中的一个子查询中

时间:2018-12-02 07:34:57

标签: sql sql-server subquery correlated-subquery

[在此处输入图像描述]示例数据集 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);

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

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:0)

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

我对第二个查询的表列表(大小,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 2005中引入了几种方法来实现此功能,具体取决于您使用的SQL Server版本的公用表表达式(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

答案 1 :(得分:0)

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

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