[在此处输入图像描述]示例数据集 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无法绑定。
我添加了ERD来澄清表格。我假设我必须将Product与Available_in之间的表联接,并将available_in与Sizes联接。我正在尝试输出名称,尺寸选项,product_id
答案 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;
您会注意到,其中还包括表别名,这些别名使查询更易于编写和阅读。