0

この種のストアド プロシージャが可能かどうかを知りたいのですが、ある種のループ構造などが必要ですか? 基本的に次の順序でこれを行いたいです。

  1. 1 つのテーブルまたはビューからすべての行を取得します。(表1)
  2. テーブル 1 の列に基づいて、テーブル 2 の挿入/更新で使用する変数を設定したいと考えています。
  3. 別のテーブル (テーブル 3) を参照して、テーブル 1 からキーを見つけます。これは、行データが陥る可能性のあるすべてのケースで「オーバーライド」されます。
  4. table2 を挿入または更新します。

これが可能である場合、回答にある種のドラフトを取得していただけますか? 読んでくれてありがとう!助けてください!これは、私が考えていることの別の種類の「図」です。

  1. select * from table1
  2. case [table1].[table1column] - [table1].[table1column] <=0, parameter1= "a" (多くの場合)
  3. ケース [テーブル 1].[テーブル ID] テーブル 3 に存在、パラメータ 1 = [テーブル 3].[パラメータ]
  4. case [table1].[tableID] table2 に存在、update、そうでなければ挿入

これまでのすべての試みに感謝します!!これがわかったら、投稿します。

4

3 に答える 3

2

もっと情報が必要ですが、98% 以上の確率で、2 つのクエリ (挿入用と更新用) ですべて実行できると思います。

挿入の一般的な例を次に示します。

INSERT INTO [Table2]
    SELECT 
        t1.[col1], /* use columns from table1 to update table2 */
        COALESCE(t3.[col2], t1.[col2]) /* table3 "overrides" table1 */
    FROM [Table1] t1 -- get all rows from table1
    LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID
    LEFT JOIN [Table2] t2 ON t2.ID = t1.Table2ID 
    WHERE t2.OtherColumn IS NULL /* insert - only make changes where the record doesn't already exist */

そして更新:

UPDATE t2
    SET t2.[col1] = t1.[col1],
        t2.[col2] = COALESCE(t3.[col2], t1.[col2])
FROM [table1] t1
LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID
INNER JOIN [Table2] t2 ON t2.ID = t1.Table2ID /* update - only make changes where the record does already exist */
于 2009-08-13T15:14:05.397 に答える
1

データモデルに関する詳細情報なしで言うのは難しいですが、反復なしで処理できる、あなたが説明したものと同様のケースがあります。

たとえば、t1とt3の左結合を選択したり、t3値が存在する場合はそれを使用したり、t1列の値に基づく式を使用したりできます。これが大まかなサンプルです。

insert into t2 (column list)

Select case when t3.Column is not null then t3.Column 
when t1.Column = 'somevalue' then 'someothervalue' 
else...(other conditions/values) end
...
from t1 left join t3 on t1.Key = t3.Key 

(特定の状況に関する詳細を増やすと、取得できるヘルプの品質が向上します)

于 2009-08-13T15:16:22.883 に答える
1

私は銃を飛び越えて、あなたがMSSQLServerについて話していると仮定します。

はい、そのようなことは可能です。始めるための疑似コードを次に示します。

declare @someTable (
    idx int identity(1,1),
    column1 type,
    column2 type,
    etc type )

declare @counter

set @counter = 1

insert into @someTable (column1, column2, etc)
select column1, column2, etc from table1

while @counter < (select max(idx) from @someTable)
begin

   -- loop through records and perform logic
   insert result into table3

   set @counter = @counter + 1

end

ただし、可能であれば...単一のクエリを使用してみてください。テーブルを結合し、Caseステートメントを使用してロジックを実行します。

于 2009-08-13T15:17:49.230 に答える