A表
Path
1_2_3_4
1_2
2_3
3_4
1_4
1_5
B表
ID
2
3
4求一条SQL,查找在A表Path字段中存在B表ID的记录
我自己写了一条,但失败了
SELECT *
FROM A
WHERE (
SELECT CHARINDEX(B.ID, A.Path)
FROM B
) > 0
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。请问应该如何实现
Path
1_2_3_4
1_2
2_3
3_4
1_4
1_5
B表
ID
2
3
4求一条SQL,查找在A表Path字段中存在B表ID的记录
我自己写了一条,但失败了
SELECT *
FROM A
WHERE (
SELECT CHARINDEX(B.ID, A.Path)
FROM B
) > 0
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。请问应该如何实现
FROM A AS t
WHERE EXISTS(SELECT *
FROM B
WHERE CHARINDEX('_'+RTRIM(ID)+'_','_'+t.path+'_')>0)
FROM A
WHERE exists
(
select 1
from B
where charindex(B.ID, A.Path) > 0
)
DECLARE @A TABLE(Path VARCHAR(10))
INSERT @A SELECT '1_2_3_4'
INSERT @A SELECT '1_2'
INSERT @A SELECT '2_3'
INSERT @A SELECT '3_4'
INSERT @A SELECT '1_4'
INSERT @A SELECT '1_5'
DECLARE @B TABLE(ID INT)
INSERT @B SELECT 2
INSERT @B SELECT 3
INSERT @B SELECT 4
SELECT DISTINCT A.* FROM @A A INNER JOIN @B B ON CHARINDEX(LTRIM(B.ID), A.Path)>0
/*Path
----------
1_2
1_2_3_4
1_4
2_3
3_4*/
这样就可以了吧?
where exists(select 1 from B where charindex('_'+rtrim(ID)+'_','_'+A.path+'_')>0)