asp.net如何从联接的表中检索数据?

发布时间: 2017/3/26 4:51:48
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 3 表︰

products table
--------------
id
name
...


categories table
----------------
id
name
...


product_categories table
------------------------
product_id
category_id

和他们一起做此查询︰

select p.*
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id

此查询返回多个记录的每个产品,每个类别的产品,但我想要只有一个产品和多个类别的产品。

这是我的输出︰

p.Id  p.name --> cat_id cat_name

1 product_1 --> 1 cat1
1 product_1 --> 3 cat3
1 product_1 --> 2 cat2
1 product_1 --> 6 cat6 
2 product_2 --> 5 cat5
2 product_2 --> 1 cat1 
.
.
.

和所需的输出︰

p.Id  p.name --> cat_id cat_name,cat_id cat_name,...

1 product_1 --> 1 cat1,3 cat3,2 cat2,6 cat6 
2 product_2 --> 5 cat5,1 cat1 
.
.
.

如何能做到?

解决方法 1:

如果你不想冗余的产品记录,换句话说,你只想类别信息,别无其他,然后你不需要放在首位 (假设你正在使用的产品 id) 主要产品表联接。

然而,你的问题是,除非你打算来显示每一个可能的类别和产品是否有它的一列或不那么你会需要附近做工作。我首选的方法将创建游标,贯穿于每个行和成单个字符串提取给定的产品 id 的类别并将此字符串放入新表 (产品 id、 类别)。

DECLARE @productId int
DECLARE @prevProductId int
SET @prevProductId = 0
DECLARE @cid int
DECLARE @cname nvarchar(255)
DECLARE @categoryList nvarchar(max)
SET @categoryList = ''

DECLARE @ProdCatTable TABLE
(
    ProductId int,
    Categories nvarchar(max)
)

DECLARE category_cursor CURSOR FOR
SELECT pc.product_id, c.id, c.name
FROM categories c
JOIN product_categories pc
ON pc.category_id = c.id
ORDER BY pc.product_id

OPEN category_cursor

FETCH NEXT FROM category_cursor
INTO @productId, @cid, @cname

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @prevProductId = 0
    BEGIN
        SET @categoryList = @cid + ' ' + @cname
        SET @prevProductId = @productId
    END
    ELSE IF (@prevProductId <> @productId) AND @categoryList <> ''
         INSERT INTO @ProdCatTable (ProductId, Categories)
         VALUES (@prevProductId, @categoryList)
         SET @prevProductId = @ProductId
         SET @categoryList = ''
    ELSE
    BEGIN
        SET @categoryList = @categoryList + ', ' + @cid + ' ' + @cname
    END

    FETCH NEXT FROM category_cursor
    INTO @productId, @cid, @cname
END

CLOSE category_cursor
DEALLOCATE category_cursor

SELECT ProductId, Catgories
FROM @ProdCatTable

︰ 这还没有被测试,但我认为它应该工作是否你乐意返回表的产品 id 作为你的身份和类别作为一个字符串。

官方微信
官方QQ群
31647020