SQL - 连接表,其中一列是列表

时间:2010-09-22 16:43:35

标签: sql sql-server sql-server-2008 list join

我正试着加入两张桌子。我遇到的问题是我试图加入的其中一个列是一个列表。

因此可以使用“IN”而不是“=”来连接两个表。

SELECT ID  
FROM tableA INNER JOIN  
tableB ON tableB.misc IN tableA.misc  
WHERE tableB.miscTitle = 'help me please'  


tableB.misc = 1  
tableA.misc = 1,2,3  

提前致谢

4 个答案:

答案 0 :(得分:5)

如果没有主要的解决方法,就不可能得到你想要的东西。不要存储你想要加入列表的项目!实际上,逗号分隔的列表几乎不应存储在数据库中。只有这是笔记类型信息才会被接受,这些信息永远不需要在clasue或join的查询中使用。

如果您遇到这种可怕的设计,那么您将不得不将列表解析为临时表或表变量,然后通过它加入。

答案 1 :(得分:1)

试试这个:

SELECT ID  
FROM tableA INNER JOIN  
tableB ON ',' + TableA.misc + ',' like '%,' + cast(tableB.misc as varchar) + ',%'
WHERE tableB.miscTitle = 'help me please'  

答案 2 :(得分:1)

一个字符串解析函数,如找到的here和CROSS APPLY应该可以解决这个问题。

CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1))
RETURNS @parsedString TABLE (string NVARCHAR(MAX))
AS 
BEGIN
   DECLARE @position int
   SET @position = 1
   SET @string = @string + @separator
   WHILE charindex(@separator,@string,@position) <> 0
      BEGIN
         INSERT into @parsedString
         SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position)
         SET @position = charindex(@separator,@string,@position) + 1
      END
     RETURN
END
go

declare @tableA table (
    id int,
    misc char(1)
)

declare @tableB table (
    misc varchar(10),
    miscTitle varchar(20)
)

insert into @tableA
    (id, misc)
    values
    (1, '1')

insert into @tableB
    (misc, miscTitle)
    values
    ('1,2,3','help me please')

select id
    from @tableB b
        cross apply dbo.fnParseStringTSQL(b.misc,',') p
        inner join @tableA a
            on a.misc = p.string
    where b.miscTitle = 'help me please'

drop function dbo.fnParseStringTSQL

答案 3 :(得分:0)

ID也在tableB中吗?如果是这样,您可以反转表,并在WHERE部分中向后运行IN,如下所示:

SELECT ID
FROM tableB
WHERE tableB.miscTitle = 'help me please'
    AND tableB.misc IN (SELECT tableA.misc FROM tableA)

如果不是,您可以使用交叉连接来获取表之间的所有行组合,然后删除不遵守IN的行。警告:如果表很大,这将成为一个巨大的连接。例如:

SELECT ID
FROM tableA
CROSS JOIN tableB
WHERE tableB.miscTitle = 'help me please'
    AND tableB.misc IN tableA.misc
编辑:没有意识到“在列表中”是指以逗号分隔的VARCHAR。 SQL的IN不适用于此,也不应该以可能的方式存储数据库中的可连接数据。

相关问题