不确定如何描述,所以我将展示示例:
表 PAGES
id int
parent int
name nvarchar
status tinyint
表 PAGES_MODULES
id int
id_parent int
module_type nvarchar
module_id int
status int
一个页面可以有多个链接模块。示例记录:
id parent name status
1 -1 Xyz 1
2 -1 Yqw 1
id id_parent module_type module_id status
1 1 ARTICLE 1 1
2 1 GALLERY 2 1
3 2 CATEGORY 3 1
如果我选择左连接page_modules,我需要创建一个不会返回2个结果的select。
我想选择哪个返回链接的模块:
id parent name status modules
1 -1 Xyz 1 ARTICLE GALLERY
2 -1 Yqw 1 CATEGORY
这可能吗?
感谢。
更新
我在SELECT方法中尝试过COALESE,CROSS APPLY和SELECT,得出了这些结论:
http://blog.feronovak.com/2011/10/multiple-values-in-one-column-aka.html
希望我能在这里发布这些内容,而不是垃圾邮件或其他内容。
答案 0 :(得分:2)
您需要创建一个可以将字符串连接在一起的自定义聚合函数,没有内置的SQL Server函数可以执行此操作。
您可以使用.Net程序集创建自定义聚合函数(假设您使用的是最新版本的SQL)。以下是关于如何执行此操作的MS参考(文章中的示例实际上是您所需要的CONCATENATE函数):http://msdn.microsoft.com/en-us/library/ms182741.aspx
答案 1 :(得分:1)
使用group_concat()将多行数据的数据放入单个字段中。请注意,它确实有一个长度限制(默认情况下为1024个字符),因此,如果您要将group_concatted列为zillion记录,除非您提高限制,否则只会获得前几行值。
SELECT ..., GROUP_CONCAT(modules SEPARATOR ' ')
FROM ...
GROUP BY ...
请注意,它是一个聚合函数,因此您必须有一个group-by子句。
答案 2 :(得分:1)
-- ==================
-- sample data
-- ==================
declare @pages table
(
id int,
parent int,
name nvarchar(max),
status tinyint
)
declare @pages_modules table
(
id int,
id_parent int,
module_type nvarchar(max),
module_id int,
status int
)
insert into @pages values (1, -1, 'Xyz', 1)
insert into @pages values (2, -1, 'Yqw', 1)
insert into @pages_modules values (1, 1, 'ARTICLE', 1, 1)
insert into @pages_modules values (2, 1, 'GALLERY', 2, 1)
insert into @pages_modules values (3, 2, 'CATEGORY', 3, 1)
-- ==================
-- solution
-- ==================
select
*,
modules = (
select module_type + ' ' from @pages_modules pm
where pm.id_parent = p.id
for xml path('')
)
from @pages p
答案 3 :(得分:0)
您需要加入两个表,然后通过 pages.id , pages.parent , pages.status 加入GROUP BY
, pages.name 和 pages.status 。结果集中的 modules 字段是字符串聚合函数,即在Oracle LISTAGG(pages_modules.modules, ' ') as modules
中。