2011-01-26 11 views
0

Id、Speed、およびDescriptionフィールドを持つTableA(この例では簡略化)です。 TableBにはTableAの変更が含まれています。表Bは、Id(FKは表AのIdと一致する)、ModifiedSpeedおよびOriginalSpeedフィールドを含む。変数テーブルの更新ケース

基本的には、TableBにTableAに関するレコードがあるかどうかに基づいて、1つのステートメント内でTableA SpeedまたはTableB OriginalSpeedを更新することができます。ここで

は、私がこれまで試してみました何私は、私は非常によくそれを説明していますかわからないよう、うまくいけばそれは私が何をしたいのいくつかのアイデアを与えるだろう。

SELECT a.Id, a.Description, a.Speed, CASE 
    WHEN EXISTS(SELECT b.Id FROM TableB b WHERE b.Id = a.Id) THEN 
     UPDATE TableB SET OriginalSpeed = 
      CASE 
       WHEN (a.Speed is not null) THEN a.Speed 
       WHEN a.Description = 'Motorway' THEN 70 
       WHEN a.Description = 'A Road' THEN 60 
       ELSE 30 
      END 
    ELSE 
     UPDATE TableA SET Speed = 
      CASE 
       WHEN (a.Speed is not null) THEN a.Speed 
       WHEN a.Description = 'Motorway' THEN 70 
       WHEN a.Description = 'A Road' THEN 60 
       ELSE 30 
      END 
END 
FROM TableA a 

を任意の助けをいただければ幸いです。

+0

select文の途中で更新文を使用することはできません。 case文を使用して、更新する表を切り替えることはできません。ストアドプロシージャを使用してデータを更新していますか?何らかの監査テーブルを作成しようとしていますか? – codingbadger

+0

@Barry:私は更新のためにストアドプロシージャを使用しています。はい、私はSqlにはあまりよくありませんが、制限や最善の方法を試しています。 TableAは道路リンクですが、プロジェクトの要件はエンドユーザーが速度を変更でき、変更された場合、エクスポートストアドプロシージャが実行されたときにTableA値は更新されませんが、速度変更テーブル(TableB )が修正されていない場合は、TableAの速度値は – Manatherin

答えて

2

二つの文を更新します更新します。

UPDATE 
    b 
SET 
    OriginalSpeed = CASE 
       WHEN (a.Speed is not null) THEN a.Speed 
       WHEN a.Description = 'Motorway' THEN 70 
       WHEN a.Description = 'A Road' THEN 60 
       ELSE 30 
      END 
FROM 
    TableB b 
     inner join 
    TableA a 
     on 
      b.Id = a.Id 

UPDATE 
    a 
SET 
    Speed = CASE 
       WHEN (a.Speed is not null) THEN a.Speed 
       WHEN a.Description = 'Motorway' THEN 70 
       WHEN a.Description = 'A Road' THEN 60 
       ELSE 30 
      END 
FROM 
    TableA a 
     left join 
    TableB b 
     on 
      a.ID = b.ID 
WHERE 
    b.ID is null 

最初のクエリのみテーブル間& B作品に参加したときに動作する(そう& Bの行との間の一致があります)。 LEFT JOINとWHERE句を使用する2番目のクエリは、Aの行がBで一致する行が見つからない行のみを更新します。

+0

ありがとう、完璧に働いた – Manatherin

2

2つのテーブルを1つのステートメントで更新することはできません。

Create Proc dbo.usp_ProcedureName 

@Id int, 
@Speed int 

As Begin 


If Exists (Select ID From TableB Where Id = @Id) 
    Begin 

     Update TableB 
     Set OriginalSpeed = @Speed 
     Where Id = @Id 


    End 
Else 
    Begin 

     Update TableA 
     Set Speed = @Speed 
     Where Id = @Id 

    End 



End 
Go 

は、ストアドプロシージャにパラメータとしてIDと新しい速度を渡しする必要があります。

+0

+1に更新する必要があります。ストアドプロシージャは、ここで最もよく聞こえる、または少なくともいくつかの複雑なコードがselectを実行してから、richght挿入を実行します。 1つのバッチ(つまり1つのコマンド実行)で提出できます.1つのSQL文(コマンド実行で複数のコマンドを実行できます)ではなくjを指定してください。 – TomTom

1

あなたは、おそらくこのような何か(私はあなたのデータ型を推測しています)を行う必要があります。 SPはこれらの値を単純に更新する必要があります。即ち、速度等を決定するロジックは、値をストアドプロシージャに渡す前に行わなければならない。 IdがテーブルBに存在する場合

、それが他の人が言っているようTableBのは、それ以外の場合は、テーブルAに

+0

私はスピードのロジックでこれをどのように呼び出すべきかを考え出すことができません。基本的には、説明をベースにしたSpeedを使ってTableAのすべての項目に対してこれを実行したいと思っています。ありがとう – Manatherin

+0

@manatherin - ああ申し訳ありませんが、私は誤解しました。 IDごとに更新していると思いました。私の答えを編集して複製するのではなく、あなたはDamienが提供した答えを使うべきです。これはあなたの問題に対する解決策です。 – codingbadger

関連する問題