数据库查询的问题,以使用子查询获取数据

时间:2015-03-16 19:27:01

标签: mysql sql-server

我遇到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的列表。问题是子查询只返回单个值。有谁知道怎么改写这个?

谢谢!

3 个答案:

答案 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