我遇到SELECT查询问题。
SELECT P.product_id
, ( SELECT Category_id
FROM Category C
WHERE C.product_id = P.product_id) AS cat
FROM Products P
这应该从PRODUCTS中提取product_id,从CATEGORY中提取category_id。如果产品属于多个类别,我希望“类别”字段返回这些category_ids的列表。问题是子查询只返回单个值。有谁知道怎么改写这个?
谢谢!
答案 0 :(得分:3)
Select中的子查询必须返回标量值,否则会出错。您可以连接两个表以获取多个值。或者你可以强制子查询只使用TOP子句返回一个值。
尝试
SELECT P.product_id
,PC.Category_id AS Categories
FROM Products P
INNER JOIN Product_Category PC ON PC.product_id = P.product_id
OR
SELECT P.product_id
, (SELECT TOP 1 Category_id
FROM Product_Category PC
WHERE PC.product_id = P.product_id
ORDER BY PC.SomeColumn ) AS Categories
FROM Products P
答案 1 :(得分:3)
您有几个选项,其中一些包括:
select p.PRODUCT_ID, CATEGORY_ID
FROM products p
inner join product_category pc on p.product_id = pc.product_id
这将为每个product_Id和category_id组合返回一行。
另一个选项(仅限Sql server 2005+)
SELECT p.product_id,
STUFF((
SELECT ','+ convert(varchar(50), pc.category_id)
FROM product_category pc
WHERE pc.product_id = p.product_id
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
FROM products p
这将为每个产品ID创建一个逗号分隔的类别ID列表。请参阅:http://sqlfiddle.com/#!6/303e7d/1
看起来已经为完成mysql版本提供了答案
答案 2 :(得分:3)
使用GROUP_CONCAT
:
SELECT P.product_id, GROUP_CONCAT(PC.category_id SEPARATOR ', ')
FROM Product_Category PC ,
Products P
WHERE PC.product_id = P.product_id
GROUP BY P.product_id;
查看this Fiddle。