将逗号分隔值与表的列集合进行比较

时间:2015-02-26 06:12:40

标签: sql-server

一个表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

4 个答案:

答案 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表。

CLICK HERE FOR FIDDLE

您还可以参考以下完整代码:

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,'&','&amp;'), ',', '</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,'&','&amp;'), ',', '</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))