基于逗号分隔值连接表

时间:2014-10-07 12:50:23

标签: sql-server

如何连接两个表,其中一个表在一列中有多个逗号分隔值,引用另一列中的id

第一张表

Name    | Course Id
====================
Zishan  | 1,2,3                                           
Ellen   | 2,3,4                

第二张表

course id | course name 
=======================
   1      |  java
   2      |  C++
   3      |  oracle
   4      |  dot net

4 个答案:

答案 0 :(得分:13)

也许这个丑陋,我还没有检查结果:

select names.name, courses.course_name
from names inner join courses
    on ',' + names.course_ids + ',' like '%,' + cast(courses.course_id as nvarchar(20)) + ',%'

答案 1 :(得分:2)

首先,您的数据库结构不是标准化,应该是。由于它已经以这种方式设置,这里是如何解决问题。

你需要一个函数来首先分割你的字符串:

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, '');

然后,您需要创建一个视图以弥补您的结构:

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项。

既然您有一个生成分隔字段的视图,您可以在视图上进行常规连接,只需像使用表格一样使用视图。

SELECT * 
FROM yourView 
JOIN table1.field ON table2.field

但是,由于我不认为你的第二个字段中的第3个字段总是有3个值,所以你需要稍微调整一下。

我的回答灵感来自:

SQL query to split column data into rowsEquivalent of explode() to work with strings in MySQL

答案 2 :(得分:0)

SELECT f.name,s.course_name FROM table1 AS f INNER JOIN table2 as on ON f.course_id IN(s.course_id)

答案 3 :(得分:-4)

使用以下查询解决方案

Select * from table_2 t2 INNER JOIN table_1 t1 on t1.Course Id = t2.course id
相关问题