我有两张桌子:
表条目 -
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
我一直在网上搜索一段时间但没有成功。我不知道该找什么。
答案 0 :(得分:0)
好像你正在寻找某种交叉申请。但是,在表中的单个列中使用逗号分隔值并不是一个好主意。你最好有一个条目表,一个标签表和一个看起来像
的entry_tag表Entry_ID Tag_ID
1 0001
1 0002
2 0002
2 0003
然后您通过该表加入以获取标记的名称。这使您不会破坏第一个普通表单,并允许您更清晰地编写查询。
希望有所帮助。
答案 1 :(得分:0)
您的架构设计存在根本缺陷,如果不是太晚,则应予以纠正。您在Entrys和标签之间存在多对多关系,应该使用联结表进行解析。
答案 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