2009-08-13 11 views
0

この種類のストアドプロシージャが可能かどうか知りたいですか、何らかのループ構造が必要ですか?私はこれを基本的に次の順序で実行したい:ストアドプロシージャは、選択、条件、変数の設定、テーブルへの挿入/更新

  1. 1つのテーブルまたはビューからすべての行を取得する。 (表1)
  2. 表1の列に基づいて、私は挿入/更新table2で使用する変数を設定します。
  3. 私はtable1からキーを見つけるために、別のテーブル(table3)を参照したいと考えています。
  4. 表2を挿入または更新します。

これが可能であれば、回答には何らかの草案をお願いしますか? 読んでいただきありがとうございます! PLZが手伝ってください! はここで別のソートの私が考えているものの "図" です:

  1. は* [TABLE1]ケース
  2. TABLE1からを選択し、[table1column] - = 0 [TABLE1] [table1column] <、パラメータ1。 = "a"(多くの場合)
  3. ケース[table1]。[tableID]テーブル3に存在する、parameter1 = [table3]。[parameter]
  4. case [table1]。[tableID] table2、update、elseに存在するインサート

ありがとうございますこれまで私がこれを理解すると、私はそれを投稿するつもりです。

+1

どのRDBMS?MySQL? SQLサーバー? –

+0

あなたはあなたの質問に違った言い方をすることはできますか?私は、各ステップの目標、特にステップ3を理解するのは少し難しいと思っています。もう少し詳細を追加すると、より具体的な答えが得られます。 –

+0

これを単一のSQL文で行うことを検討しましたか?あなたの説明に基づいて、これはあなたが何をする必要があるのか​​の詳細に応じて、ループを持つストアドプロシージャを必要としないかもしれません。 – Chi

答えて

1

私は銃をジャンプして、MS SQL Serverの話をしていると仮定するつもりです。

はい、そういうことが可能です。

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ステートメントを使用してロジックを実行します。

+0

それは間違いなく動作しますが、ループは悪い考えであり、奨励されるべきではありません。セットベースのソリューションが優れています。 – HLGEM

+0

それは私が示唆していることです...あなたはポストの最後にそれを作らなければなりません。 –

+0

これを選択します。私はそれが完全に洗練されていないが、私はこのループから始めるつもりです...私は1つのクエリでそれをすべて行う方法を見つけるまで、それは吸うつもりです – Marlon

2

さらに詳しい情報が必要ですが、これは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 */ 
1

それはあなたのデータモデルについての詳細情報なしで言うのは難しいですが、1と同様の例があります繰り返しなしで処理できると説明しています。

たとえば、t1とt3の左結合を選択し、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 

(特定の状況についての増加の詳細は、あなたが得る助けの品質を向上させる)

関連する問題