如何将 LEFT 连接的结果作为一个字段获取到另一个表中

发布于 2024-12-12 01:11:57 字数 1245 浏览 0 评论 0 原文

不确定如何描述这一点,因此我将展示示例:

table PAGES

id      int
parent  int
name    nvarchar
status  tinyint

table 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

我需要的是创建 select,如果我选择 left join 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

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

Not sure how to describe this so I will show example:

table PAGES

id      int
parent  int
name    nvarchar
status  tinyint

table PAGES_MODULES

id          int 
id_parent   int
module_type nvarchar
module_id   int
status      int

One page can have more than one linked modules. Example records:

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

What I need is to create select which will not return 2 results if I do select left join page_modules.

I would like to have select which returns linked modules as this:

id    parent    name     status    modules
1     -1        Xyz      1         ARTICLE GALLERY
2     -1        Yqw      1         CATEGORY

Is that possible?

Thanks.

UPDATE

I have tried COALESE, CROSS APPLY and SELECT within SELECT methods and came to these conclusions:

http://blog.feronovak.com/2011/10/multiple-values-in-one-column-aka.html

Hope I can publish these here, not meaning to spam or something.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

烂柯人 2024-12-19 01:11:57

您需要创建一个可以将字符串连接在一起的自定义聚合函数,没有内置的 SQL Server 函数可以执行此操作。

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

You'd need to create a custom aggregate function that could concatenate the strings together, there is no built-in SQL Server function that does this.

You can create a custom aggregate function (assuming your using the latest version of SQL) using a .Net assembly. Here's the MS reference on how to do this (the example in the article is actually for a CONCATENATE function just like you require): http://msdn.microsoft.com/en-us/library/ms182741.aspx

请持续率性 2024-12-19 01:11:57

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

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

请注意,它是一个聚合函数,因此您必须有一个 group-by 子句。

Use group_concat() to smoosh multiple rows' worth of data into a single field like that. Note that it does have a length limit (1024 chars by default), so if you're going to have a zillion records being group_concatted, you'll only get the first few lines worth unless you raise the limit.

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

Note that it IS an aggregate function, so you must have a group-by clause.

烟若柳尘 2024-12-19 01:11:57
-- ==================
-- 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
-- ==================
-- 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
栖迟 2024-12-19 01:11:57

您需要连接两个表,然后按 pages.idpages.parentpages.status 进行GROUP BYpages.namepages.status。结果集中的 modules 字段是一个字符串聚合函数,即在 Oracle 中 LISTAGG(pages_modules.modules, ' ') 作为模块

You need to join both tables and then GROUP BY by pages.id, pages.parent, pages.status, pages.name and pages.status. Your modules field in your resultset is then a string aggregate function, i.e in Oracle LISTAGG(pages_modules.modules, ' ') as modules.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文