如何连接两个表,其中一个表在一列中有多个逗号分隔值,引用另一列中的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
答案 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 rows 和 Equivalent 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