我有以下表格结构:
项目:
Id,
Description
标签:
Id,
TagName
ItemXrefTag
Id,
TagId,
ItemId
阅读与某些标签相关的所有项目以及与项目相关的所有其他标签的最佳方式是什么,以便能够显示项目列表以及与该项目相关的所有标签?
如果不清楚我会举例:
项目,标签:
Code complete, book|programming|cool
Reactoring, book|programming|refactoring|cool
C# for dummies, book|dont like it| not cool
P.S。我正在使用亚音速,但因为它支持从查询中获取数据我可以通过查询来获取所有数据。当然,我可以执行连接并迭代多行。我得到并使用每个标签的集合收集项目。我只对最有效的方法感兴趣。
答案 0 :(得分:1)
您正在搜索GROUP_CONCAT
功能。刚刚使用
SELECT o.orderno,
GROUP_CONCAT(d.itemno ORDER BY d.itemno ASC SEPARATOR ', ') as items
FROM order o
LEFT JOIN order_detail d ON o.id = d.order_id
GROUP BY d.order_id
ORDER BY o.id ASC
使用逗号分隔的有序商品列表返回订单号的结果:
orderno | items
----------------------------------
201010001 | 100123, 100456, 100987
201010002 | 123456, 123457
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
但是我想这不是ANSI SQL所以它不适用于SQL-Server ;-),但是在stackoverflow的快速搜索返回了这个问题:Simulating group_concat MySQL function in Microsoft SQL Server 2005?
sql server中的相应命令应为CROSS APPLY
关于CROSS APPLY的另一篇好文章
http://www.sqlteam.com/article/using-cross-apply-in-sql-server-2005
对于亚音速的使用,你应该使用InlineQuery
(又名CodingHorror
)来执行带有亚音速的原始sql。
答案 1 :(得分:0)
这是加入所有数据的示例。除非你指定一个你想要的格式,这是我能做的最好的。
declare @item table (IID int identity(1,1), Description varchar(max))
declare @tags table (TID int identity(1,1), TagName varchar(50))
declare @ItemXrefTag table (XID int identity(1,1), TID int, IID int)
insert into @item values ('Book A')
insert into @item values ('Book B')
insert into @tags values ('Awesome!')
insert into @tags values ('Suckage!')
insert into @tags values ('Mediocre')
insert into @ItemXrefTag values (1,1)
insert into @ItemXrefTag values (3,1)
insert into @ItemXrefTag values (2,2)
select *
from @ItemXrefTag a
left outer join @tags b
on a.TID=b.TID
left outer join @item c
on a.IID=c.IID