如何在SQL中连接来自同一个表的连接值

时间:2015-04-17 18:01:21

标签: sql

我有两张桌子:

表条目 -

ID    Entry       Tags
1      ABC      0001,0002
2      DEF      0002,0003

表格标签 -

ID       Tag
0001    Tag1
0002    Tag2
0003    Tag3

有没有办法编写一个返回类似

的查询
ID   Entry    Tags
1     ABC   Tag1,Tag2
2     DEF   Tag2,Tag3

我一直在网上搜索一段时间但没有成功。我不知道该找什么。

4 个答案:

答案 0 :(得分:0)

好像你正在寻找某种交叉申请。但是,在表中的单个列中使用逗号分隔值并不是一个好主意。你最好有一个条目表,一个标签表和一个看起来像

的entry_tag表
Entry_ID  Tag_ID
1         0001
1         0002
2         0002
2         0003

然后您通过该表加入以获取标记的名称。这使您不会破坏第一个普通表单,并允许您更清晰地编写查询。

希望有所帮助。

答案 1 :(得分:0)

您的架构设计存在根本缺陷,如果不是太晚,则应予以纠正。您在Entrys和标签之间存在多对多关系,应该使用联结表进行解析。

enter image description here

答案 2 :(得分:0)

执行以下步骤以生成预期输出: -

第1步 - 创建临时表

CREATE TABLE #TEMP (ID int, entry varchar(50),tags varchar(50))

第2步 - 插入临时表

INSERT INTO #TEMP 
select entries.id,entries.entry,tags.tags
from entries inner join tags
    on ',' + entries.tags + ',' like '%,' + tags.id + ',%'

第3步 -

Select distinct T2.id, T2.entry,
    substring(
        (
            Select ','+T1.tags  AS [text()]
            From dbo.#TEMP T1
            Where T1.id =T2.id
            ORDER BY T1.id
            For XML PATH ('')
        ), 2, 1000) tags
From dbo.#TEMP T2

建议: - 您的数据库设计违反了第一种正常形式的数据库设计,必须进行更改。一列不应包含ids作为逗号分隔值。会出现严重的性能问题,查询总是很困难。

第一个普通形式(或1NF)要求表格每列中的值是原子的。原子意味着列中没有值集。 Refer Here

答案 3 :(得分:0)

首先,您需要修复关系模型,因为它不正确。

您需要3个实体来表示多对多的关系,如下所示:Entry,Tag,Entry_Tag。

在Oracle数据库中,存在一个分组函数调用“LISTAGG”来在一行中连接多个结果,因此我们可以为每个条目记录分组标记的结果。 如果您不使用Oracle,需要查阅数据库的文档,以找出可以将结果连接成一行的函数。

最后,最终查询应如下所示:

SELECT E.ID, E.NAME, (LISTAGG(T.NAME, ', ') WITHIN GROUP (ORDER BY T.NAME)) Tags
FROM ENTRY E
INNER JOIN ENTRY_TAG ET ON ET.ID_ENTRY = E.ID
INNER JOIN TAG T ON T.ID = ET.ID_TAG
GROUP BY E.ID, E.NAME