0

我的表icdClm是一个包含人员人口统计数据的表和另一个列出与该人相关的各种兴趣代码的表之间的连接表。我希望能够多次加入这些表格。由于此时简单起见,我对关系中涉及的其他表不感兴趣。我想要一个while loop帮助生成查询(如果有更好的方法我对不同的实现持开放态度。)

如果查询运行两次(两个派生表运行两次),以下是所需的输出。

select distinct x1.patid
from
(
select ic.patid
    from icdClm as ic
    where ic.icd like '123%'
) x1 inner join 
(
select ic.patid
    from icdClm as ic
    where ic.icd like '456%'
)x2 on x1.patid=x2.patid
inner join 
(
select ic.patid
    from icdClm as ic
    where ic.icd like '789%'

) x3 on x1.patid=x3.patid

请注意,它们对派生表的别名每次都增加 1。现在我的代码。这段代码不会产生错误,但我让它运行了 10 多分钟,还没有返回任何结果。最终,我想创建另一个依赖于这个的存储过程,它询问您想要的派生表的数量,然后用where ic.icd like '123%'用户输入的参数填充,但首先要做的事情是:下面的查询有什么问题?

declare 
@x int
,@y int
,@sql nvarchar(1000)

select 
@x=1
,@y=3
,@sql =
'select distinct x1.patid
from
(
select ic.patid
    from icdClm as ic
    where ic.icd like ''123%''
) x1'
while @x < @y
begin;
set @sql=@sql+ 
'inner join 
(
    select ic.pati
    from icdClm as ic
    where ic.icd like ''456%''
) x1 on x'+CAST(@y as CHAR(10))+'.patid=x1.patid'
set @y=@y+1
end;
print @sql
4

2 回答 2

2
while @x < @y
begin;

set @y=@y+1
end;

@y是递增的,所以这个循环要么永远不会执行(因为 y 小于 x),要么它将是一个无限循环*,因为@y总是大于@x

也许你的意思是@x=@x+1

*你最终可能会得到整数溢出

于 2012-12-04T18:18:06.687 回答
2

看起来你正在做一个和多个条款的条件。
如果您使用相交,那么您不需要唯一的名称。
我这样做,但我用 C# 构建它。
抱歉缺少 SP 示例。

select patid
    from icdClm 
    where icd like '123%'
Intersect
select patid
    from icdClm 
    where icd like '456%' 

EXCEPT 和 INTERSECT (Transact-SQL)

我发现相交是有效的。
超过 5 个连接时,查询优化器遇到了我所谓的防御性问题,并且对我的数据产生了较差的响应时间。
Intersect 以蛮力的方式一次执行一次,这可能对您的数据有利也可能不利。
由于您喜欢的开头没有通配符,因此它可能使用索引。

于 2012-12-04T18:29:45.957 回答