在我的WHERE语句中,我试图找到一些具有两个条件的实体,我不能使用IN
语句,因为它的工作方式与OR
类似,只返回一个很多的结果,意味着如果我我正在使用:
WHERE R.RiskID IN(221,111)
所以我会得到有或111或222的文件
我使用AND
语句是一个问题,因为proc是动态的并且生成复杂的代码。
例如:
WHERE R.RiskID IN(111,222)
同样,它的工作方式与OR
语句类似。 defenition表每个RiskID
都有一行,意味着如果我对同一个文档有很多RiskIDs
,则表示:
RiskID DocumentID
111 345
222 345
333 345
999 846
111 846
我的最终目的地应该是,如果我的输入是111,222,我需要显示所有111和222 RiskIDs
的文件。
答案 0 :(得分:0)
如果有人遇到同样的问题,那么答案就是组合和许可......
;with list (n) as
(
select *
from
(
values
('a'),
('b'),
('c'),
('d'),
('e')
) x(y)
), cte as
(
select CAST( n AS NVARCHAR(MAX) ) n
from list c
union all
select CAST( l.n + ',' + c.n AS NVARCHAR(MAX) )
from cte c, list l
where l.n > c.n
)
select *
from cte
生成器为FROM clouse中的VALUES生成所有可能的组合。
答案 1 :(得分:-1)
胜利的过度杀伤力。将此脚本用于较小的查询或索引查询。 我已经提出了两个选项,一个是手动定义Riskid或取消注释sql查询以执行通配符或输入基于选择。
Create table #Risk (RID Int Identity,RiskID int)
/* Manual Insert */
insert into #Risk select 111
insert into #Risk select 222
/* SQL insert */
/*
insert into #Risk select distinct RiskID from Tablename where RiskID in (111,222)
*/
Declare @Loop int
set @Loop = 1
Create table #final (RiskID int, DocumentID int)
while @Loop < (select MAX(rid)+1 from #Risk)
Begin
insert into #final
select Riskid, DocumentID
from tablename
where riskid = (select riskid from #Risk where RID = @Loop)
set @Loop = @Loop + 1
End