如何INNER JOIN多个值

时间:2017-05-22 05:30:15

标签: sql-server

SELECT t1.*, t2.name as song_name
FROM table1 as t1
INNER JOIN table2 as t2
ON t1.song_name_id = t2.id 
WHERE t1.id = '..'

当t2.id列有两个id就像这个6,12时,我得到以下错误。显然,工作时,记录t2.id(nvarchar)只有一个。我怎样才能使它与两个/多个一起工作?

错误:

Conversion failed when converting the nvarchar value '6,12' to data type int.

3 个答案:

答案 0 :(得分:0)

错误可能是因为table1.song_name_idtable2.id具有不同的数据类型。请确保它们属于同一类型或使用convert功能。

答案 1 :(得分:0)

不要将CSV数据存储在您的表中,但下面给出了一个临时解决方案。

SELECT t1.*, t2.name as song_name
FROM table1 as t1
INNER JOIN table2 as t2
ON (t1.song_name_id = left(t2.id,1))
or(t1.song_name_id = right(t2.id,1)) 
WHERE t1.id = '..'

如果table2 id列包含两个以逗号分隔的值,则应处理不同的方法。

答案 2 :(得分:0)

正如Bishakh Ghosh所说,你真的应该加入相同类型的领域,而且Coder1991也说,你真的不应该在一个字段中存储逗号分隔值。

鉴于该字段处于该状态,您可以使用pattern matching来查找t2.id是否包含t1.song_name_id中的值。

在下面的例子中,额外的逗号将允许" 6,12"成为",6,12,"和声明中的song_name_id将成为"%,6,%"然后会找到一个匹配。

SELECT
    t1.*, 
    t2.name as song_name
FROM
    table1 as t1
INNER JOIN table2 as t2 ON 
    ',' + t2.id + ',' LIKE '%,' + CONVERT(VARCHAR(20),t1.song_name_id) + ',%'
WHERE
    t1.id = '..'