【问题标题】:How to get result of LEFT join into another table as one field如何将左连接的结果作为一个字段添加到另一个表中
【发布时间】:2011-10-27 16:52:57
【问题描述】:

不知道怎么描述,所以我举个例子:

表格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 个结果。

我想选择返回链接模块的方式:

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

希望我可以在这里发布这些,而不是垃圾邮件或其他内容。

【问题讨论】:

标签: sql tsql select left-join


【解决方案1】:

您需要创建一个可以将字符串连接在一起的自定义聚合函数,没有内置的 SQL Server 函数可以做到这一点。

您可以使用 .Net 程序集创建自定义聚合函数(假设您使用的是最新版本的 SQL)。这是有关如何执行此操作的 MS 参考(本文中的示例实际上是针对您需要的 CONCATENATE 函数):http://msdn.microsoft.com/en-us/library/ms182741.aspx

【讨论】:

【解决方案2】:

使用group_concat() 将多行的数据平滑到这样的单个字段中。请注意,它确实有长度限制(默认情况下为 1024 个字符),因此如果您将有无数条记录被 group_concatted,除非您提高限制,否则您只会获得前几行的价值。

SELECT ..., GROUP_CONCAT(modules SEPARATOR ' ')
FROM ...
GROUP BY ...

注意它是一个聚合函数,所以你必须有一个 group-by 子句。

【讨论】:

  • 我认为这只是 MySQL,不要认为 MSSQL 具有等效的聚合功能。
  • 啊。多,对。我确实在某个地方找到了一些解决方法。这是一个:stackoverflow.com/questions/451415/…
【解决方案3】:
-- ==================
-- 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

【讨论】:

    【解决方案4】:

    您需要连接两个表,然后通过 pages.idpages.parentpages.statusGROUP BY >pages.namepages.status。结果集中的 modules 字段是一个字符串聚合函数,即在 Oracle LISTAGG(pages_modules.modules, ' ') as modules 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多