我正试着加入两张桌子。我遇到的问题是我试图加入的其中一个列是一个列表。
因此可以使用“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
提前致谢
答案 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
不适用于此,也不应该以可能的方式存储数据库中的可连接数据。