私は SQL Server 2005 ストアド プロシージャの初心者です。思うように動かせないようです。
というテーブルからパラメーター @caseid を受け取る sp がありますannot
。@caseid
は列の値に割り当てられ、src_caseid
複数の参照 ( ref_caseid
) を持つことも、テーブル内に何も持たないこともできますannot
。INNER JOINを使用して行ったcourt
テーブルの列に応じて、条件を設定し、適切なshepardsflagを設定したいと思います。case
基本的にこれはシナリオです:
- 表
annot
-ref_caseid, src_caseid, annotation
- 表
case
-caseid, court
次のようなINNER JOIN からの一連の結果の例ref_caseid = caseid
:
ref_caseid src_caseid annotation court
17334 17338 Refd high court
17600 17338 Foll federal court
18271 17338 Foll federal court
43220 17338 Not Foll supreme court
設定条件:
レコードセットfederal court
が存在する場合は、 の行のみを取得する必要がありfederal court
ます。いいえfederal court
が見つかった場合は、他の裁判所の価値観を持つ他のケースを取り上げます。
これを達成するために、federal court
カウント用のカウンターを設定しました。しかし、SQL は最後の行のみを読み取り、@courtFC
それに基づいて値を設定しているようです。試してみましorder by
たが、うまく機能していないようです。
上記のサンプルから、ケース 17338 の最終的な shepardsflag 値は = 3 (Foll) である必要があります。これは、「連邦裁判所」のみを含む行を取得し、残りの行を無視する必要があるためです。
しかし、現在の結果は shepardsflag = 2 です。どちらが間違っていますか
うまく説明できればと思います。
誰かが正しい論理で私を助けてくれますか? 一時テーブルを作成する必要がありますか? 前もって感謝します。
脚本:
ALTER PROCEDURE [dbo].[spUpdateShepardsFlags] @caseid int = null AS
begin
declare @Shep int
declare @ref_caseid int
declare @court int
declare @courtFC int
declare @annot int
if @caseid is not null
begin
select @court = b.court, @ref_caseid = a.ref_caseid, @annot = a.annotation
from cba_annot a inner join cbm_case b on a.ref_caseid = b.caseid
where a.src_caseid = @caseid
if @court is not null
begin
if @court = 'MYFC'
set @courtFC = @courtFC + 1
if @court <> 'MYFC'
SET @courtFC = @courtFC + 0
PRINT 'The @courtFC counter : ' + CAST(@courtFC AS CHAR)
end
if @court is not NULL
begin
if @courtfc > 0
begin
if exists(select a.ref_caseid, b.court, a.annotation, a.src_caseid from
cba_annot a inner join cbm_case b on a.ref_caseid = b.caseid)
begin
if exists(select src_caseid from cba_annot where (annotation like '%Refd%'
or annotation like '%Comp%')
and src_caseid = @caseid)
set @Shep = 4
if exists(select src_caseid from cba_annot where (annotation like '%Foll%'
or annotation like '%Aff%')
and src_caseid = @caseid)
set @ShepFC = 3
update cbm_case
set shepardsflag = @shep
where caseid=@caseid
end
end
else -- if @courtFC = 0
begin --new
if exists(select a.ref_caseid, b.court, a.annotation, a.src_caseid from
cba_annot a inner join cbm_case b on a.ref_caseid = b.caseid)
begin
if exists(select src_caseid from cba_annot where (annotation like '%Refd%'
or annotation like '%Comp%')
and src_caseid = @caseid)
set @Shep = 4
if exists(select src_caseid from cba_annot where (annotation like '%Foll%'
or annotation like '%Aff%')
and src_caseid = @caseid)
set @Shep = 3
if exists(select src_caseid from cba_annot where (annotation like '%Not Foll%'
or annotation like '%Dist%')
and src_caseid = @caseid)
set @Shep = 2
update cbm_case
set shepardsflag = @shep
where caseid=@caseid
end
end -- new
end
else --- if court is NULL -- case not referred by any other case
update cbm_case
set shepardsflag = 5
where caseid=@caseid
end
else -- if caseid is null
-- other condition