Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于逗号分隔值联接表_Sql Server - Fatal编程技术网

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