0

私のテーブルicdClmは、人の人口統計を含むテーブルと、その人に関連するさまざまな関心コードをリストする別のテーブルとの間のジャンクション テーブルです。これらのテーブルに可変回数参加できるようにしたいと思います。この時点では単純にするために、関係に関係する他のテーブルには興味がありません。クエリの生成を支援したいwhile loop(別の実装を受け入れるより良い方法がある場合)。

以下は、クエリが 2 回実行された場合の望ましい出力です (2 つの派生テーブルに対して 2 回)。

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

複数の用語の and 条件を実行しようとしているようです。
Intersect を使用する場合、一意の名前は必要ありません。
私はこれを行いますが、C# でビルドします。
SPの例がなくてすみません。

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

EXCEPT と INTERSECT (Transact-SQL)

Intersect が効率的であることがわかりました。
結合が 5 つを超えると、クエリ オプティマイザーが防御的と呼ばれるものを取得し、WITH MY DATA の応答時間が遅くなるという問題がありました。
Intersect は、ブルート フォース方式で一度に 1 つずつ実行します。これは、データに適している場合とそうでない場合があります。
あなたのようなものには最初にワイルドカードがないため、インデックスを使用する場合があります。

于 2012-12-04T18:29:45.957 に答える
2
while @x < @y
begin;

set @y=@y+1
end;

@yはインクリメントされるため、このループは実行されない (y が x より小さいため) か、@y常に よりも大きいため無限ループ* になります。@x

おそらくあなたが意味した@x=@x+1

*おそらく最終的に整数オーバーフローが発生します

于 2012-12-04T18:18:06.687 に答える