一个表X
有一个列C1
并且以逗号分隔的值,即1,2,3
另一个表格Y
有一个C2
列,其值为tinyint
唯一且有多行,而C2
列的值为
1
2
3
4
5
要求:检查X(C1)
表中是否存在Y(C2)
的所有值
试过一个:
((select Data from dbo.split(X.C1,',')) in ((Select C2 from Y where <some condition>)))
Split是一个用户定义的函数,它基于&#39;逗号&#39;并将其放入表的各行并返回该表,即
Split(X.C1,',')
返回一个包含多行的表,例如
1
2
3
但是,使用此查询会产生运行时错误:
子查询返回的值超过1。这是不允许的 子查询跟随=,!=,&lt;,&lt; =,&gt;,&gt; =或当子查询用作 表达。
任何人都可以帮助获得更可行的解决方案
先谢谢 Kiran Bussa
答案 0 :(得分:0)
我认为您必须加入查询的两个部分。
即。
((SELECT Data from dbo.split(X.C1,',') WHERE data.C1 IN ((Select C2 from Y WHERE <some condition>)))
答案 1 :(得分:0)
删除不需要的括号并添加where
条件
SELECT Data
FROM dbo.Split(X.C1, ',')
WHERE data IN (SELECT C2
FROM Y
WHERE <SOME condition>)
答案 2 :(得分:0)
我建议你将逗号分隔值拆分并存储在表变量中。这将帮助您查询您的记录。
供您参考我使用CROSS应用创建一个小的sqlfiddle以分割逗号分隔值并检入Y表。
您还可以参考以下完整代码:
Create table x (c1 varchar(10) )
insert into x values ('1,2,3')
insert into x values ('1,2,4')
insert into x values ('2,3,4')
insert into x values ('1,2')
create table Y (c1 tinyint)
insert into Y values (1)
insert into Y values (2)
insert into Y values (3)
insert into Y values (4)
insert into Y values (5)
SELECT DISTINCT Data.C1
FROM
(select
n.r.value('.', 'varchar(50)') AS C1
from x as T
cross apply (select cast('<r>'+replace(replace(c1,'&','&'), ',', '</r><r>')+'</r>' as xml)) as S(XMLCol)
cross apply S.XMLCol.nodes('r') as n(r)) DATA
WHERE data.C1 IN (SELECT C1
FROM Y)
编辑:根据评论使用Where条件编辑答案
请参阅下面的新小提琴链接 EDITED FIDDLE CLICK HERE
对于相同的表结构,新的select查询用于标识值出现的列。
SELECT DISTINCT Data.C1, DATA.FROMX
FROM
(select
T.C1 as FROMX,
n.r.value('.', 'varchar(50)') AS C1
from x as T
cross apply (select cast('<r>'+replace(replace(c1,'&','&'), ',', '</r><r>')+'</r>' as xml)) as S(XMLCol)
cross apply S.XMLCol.nodes('r') as n(r)) DATA
WHERE data.C1 IN (SELECT C1
FROM Y WHERE Y.C1 = 4)
答案 3 :(得分:0)
乌拉!!!!终于得到了解决方案:)
声明@Int_Res varchar(max) 设置@Int_Res =&#39;&#39; 选择@Int_Res = @Int_Res +&#39;,&#39; + Cast(C1 as varchar)FROM X where
dbo.Split((@ Int_Res),&#39;,&#39;)Int_Result
(Int_Result.Data in(从Y中选择C1))