0

Methodというフィールドを持つ一時テーブルがあるので、次のようになります。

DECLARE @CaseSites TABLE (
 BriefID  int,
 Method  varchar(60)
 -- other fields
)

メソッドは、別のテーブル(CaseEventTypeList)の複数の行から入力されます。

ランニング

SELECT * FROM CaseEventTypeList WHERE RefID = 1

与える

RefID TypeID
1  2
1  3
1  6

これを単一のコンマ区切りの結果に変換するのは非常に簡単です。

DECLARE @CETList varchar(30)

SELECT @CETList = COALESCE(@CETList + ',', '') + CAST(CETL.[TypeID] AS varchar)
FROM CaseEventTypeList CETL 
WHERE CETL.RefID = 1

PRINT @CETList

与える:

2,3,6

次に、これを拡張してテーブル全体を取り込む必要があります。これは私が思いついたものです:

UPDATE @CaseSites SET Method = COALESCE(Method + ',','') + CAST(CETL.TypeID AS VARCHAR)
 FROM CaseEvents CE
   JOIN CaseEventTypeList AS CETL ON CETL.RefID = CE.TypeListID
 WHERE BriefID = CE.CaseID

ただし、これは、値の各セットの最初の値でメソッドを埋めるだけです。

はオンラインでこれを見つけましたが、udfを使用したくありません-特にソリューションが非常に近いと感じた場合。

更新: データはかなり単純です。RefIdはケースごとにインクリメントされます。TypeIDは任意の数にすることができますが、現在モデル化されているのは1〜8個だけです。したがって、あなたは持っているかもしれません:

RefID TypeID
12  2
12  7
13  1
14  1
14  3
14  6

そして、これはうまくいけば次のようにモデル化されます

SELECT Method from @CaseSites
Method 
...
12  2,7
13  1
14  1,3,6
...
4

2 に答える 2

1

あなたの問題は、 update ステートメントが "SET Method = " を行ごとに 1 回しか評価しないため、リストに値が 1 つしかないためだと思います。

UDF はこれを行う簡単な方法ですが、一時テーブルを使用しているため、これはオプションではない可能性があり、とにかくそれらを避けたいと考えていました。したがって、カーソルを使用する必要があるかもしれませんが (あまり良くありません)、希望どおりに作業を完了できます。

元のSQLに基づいて私が思いついたものは次のとおりです。

DECLARE myCURSOR Cursor
FOR
  Select BriefID
  from #CaseSites

Open myCursor
DECLARE @BriefID int
DECLARE @CETList varchar(30)
Fetch NEXT FROM myCursor INTO @BriefID
While (@@FETCH_STATUS <> -1)
BEGIN
  IF (@@FETCH_STATUS <> -2)

  SET @CETList = ''
  SELECT @CETList = COALESCE(@CETList + ',', '') + CAST(CETL.[TypeID] AS varchar)
    FROM #CaseEventTypeList CETL 
   WHERE CETL.RefID = @BriefID 

  UPDATE #CaseSites
     SET Method = @CETList
   WHERE BriefID = @BriefID

  Fetch NEXT FROM myCursor INTO @BriefID
END
CLOSE myCursor
DEALLOCATE myCursor 
于 2009-11-05T15:43:35.830 に答える
0

xml の使用に問題がなければ、最初の回答よりも優れた回答を見つけました: xml を使用した相関サブクエリ。

UPDATE #CaseSites 
   SET Method = (   
                  select  cast([TypeID] as varchar(30))+ ',' 
                    from #CaseEventTypeList
                   where RefID = CE.CaseID 
                     for xml path ('') 
                )
  FROM #CaseEvents CE  
于 2009-11-05T16:37:53.007 に答える