如何从连接表中检索数据?

时间:2015-04-15 07:28:34

标签: c# sql asp.net sql-server

我有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 
.
.
.

我该怎么做?

3 个答案:

答案 0 :(得分:4)

您应该添加WHERE子句以指定ID,而在select子句中,您可能希望使用c.*而不是p.*来获取类别中的所有数据。

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth

答案 1 :(得分:0)

如果您不想要产品记录的冗余,换句话说,您只需要类别信息而不是其他内容,那么您首先不需要加入主产品表(假设您正在使用产品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作为您的身份并且类别为字符串。

答案 2 :(得分:-1)

SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id