Sql server 基于逗号分隔值联接表
我如何连接两个表,其中一个表在一列中有多个逗号分隔的值,这些值引用另一列中的Sql server 基于逗号分隔值联接表,sql-server,Sql Server,我如何连接两个表,其中一个表在一列中有多个逗号分隔的值,这些值引用另一列中的id Name | Course Id ==================== Zishan | 1,2,3 Ellen | 2,3,4 第一个表格 Name | Course Id ==================== Zishan | 1,2,3
id
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
第一个表格
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
第二张表
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
course id | course name
=======================
1 | java
2 | C++
3 | oracle
4 | dot net
使用下面的查询获取解决方案
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
Select * from table_2 t2 INNER JOIN table_1 t1 on t1.Course Id = t2.course id
首先,数据库结构没有规范化,应该规范化。既然已经这样设置了,下面是如何解决这个问题的
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
首先需要一个函数来拆分字符串:
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT) RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1), delim, '');
然后,您需要创建一个视图以弥补您的结构:
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
CREATE VIEW database.viewname AS
SELECT SPLIT_STRING(CourseID, ',', n) as firstField,
SPLIT_STRING(CourseID, ',', n) as secondField,
SPLIT_STRING(CourseID, ',',n) as thirdField
FROM 1stTable;
其中n是列表中的第n项
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
现在您有了一个生成分隔字段的视图,您可以在视图上进行普通联接,只需像使用表一样使用视图即可
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
SELECT *
FROM yourView
JOIN table1.field ON table2.field
然而,因为我不认为在第一个表的第二个字段中总是有3个值,所以需要对其进行更多的调整
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
我的答案来源于:
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
和
也许这很难看,我还没有检查结果:
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4
select names.name, courses.course_name
from names inner join courses
on ',' + names.course_ids + ',' like '%,' + cast(courses.course_id as nvarchar(20)) + ',%'
从表1中选择f.name、s.course\U name作为f
在(s.course\u id)中将表2作为f.course\u id中的s进行内部连接。请规范化您的数据库结构!将多个值合并到单个字段中时,它们将成为单个值。也许您可以创建一个视图,将数据解析为实际的关系表,然后使用该视图执行连接?像这样进行规范化(Zishan,1),(Zishan,2),(Zishan,3)和(Ellen,2),(Ellen,3),(Ellen,4)规范化数据将是更好的选择,但这里有一个答案可以帮助您解决这是一个数据库设计错误。关键是你要修复它,而不是使用黑客来获取数据。这将永久性地影响性能,并且随着数据的增长,性能会变得更差。基本上,这是一个癌症在你的系统的核心,如果你不修复它,那么你会发现随着时间的推移,问题会变得更大,更难修复。你不应该允许这个严重的设计缺陷存在,除非这是从第三方购买的软件,而数据库设计这个无能的人会让我停止使用公司设计的任何软件。就个人而言,我不喜欢在数据库级别创建逻辑。@mpacheco:我完全同意,但有时人们只是想看着世界燃烧,尽管这是一个丑陋的黑客行为,我喜欢这是一个获得预期结果的难以置信的简单方法。对于那些无法正常化数据库模式的人来说,这是一个很好的解决方法。
Name | Course Id
====================
Zishan | 1,2,3
Ellen | 2,3,4