2009-04-08 7 views
4

私は2つのテーブルを持っています。一つは単純な文字列/ IDを調べている。結合によるSQLの更新?

StrTable:文字列が一意である

 
str_key String 
0  'a' 
1  'b' 

。他はより複雑で、共有string_id

ValTable含まれています。今

 
str_key other_key val 
0  0  1.234 
0  1  1.567 
1  0  1.890 

を、私はStrTable経由str_keyを取得するためにルックアップ文字列を使用して、ValTableの更新をしたいです。

UPDATE ValTable SET val = 2.124 WHERE str_key = 0 AND other_key = 1 LIMIT 1 
IF @@ROWCOUNT=0 INSERT INTO ValTable VALUES (0,1,2.124); 

これを修正して、文字列 'a'でstr_keyを検索する方法を変更するにはどうすればよいですか?私は参加が必要だと思っていますが、私はアップデートで参加したことは一度もありません。または、where節にさらに多くを追加できますか?

+0

あなたは、あなたのテーブルのDDLを持っていますが、そのstr_keyを仮定して、あなたのValTableのためのPKを作るother_keyしていない、あなたが「LIMIT 1」を持っている理由はありますか?たとえそれがPKではないとしても、ここではLIMITを使用するのが奇妙に思えます –

+0

テーブル内の制限がなくてもテーブル全体を掃除するかどうかはわかりませんでしたが、複合キーが* *キーはその行にのみ影響します。 –

答えて

14

これはあなたが必要とする構文は次のとおりです。

UPDATE v 
SET  val = 2.124 
FROM ValTable v 
     INNER JOIN 
       StringTable s 
       ON v.str_key = s.str_key 
WHERE s.String = 'a' 
AND  v.other_key = 1 

IF @@ROWCOUNT = 0 
BEGIN 

     INSERT 
     INTO ValTable 
     SELECT str_key, 1, 2.124 
     FROM StringTable 
     WHERE String = 'a' 

END 
+0

2行目を変更するにはどうすればよいですか? IF @@ ROWCOUNT = 0 INSERT INTO v VALUES(v.str_key、1、2.124) また、別の結合を使用してv.str_keyを再決定する必要はありますか? –

1

デビッド・Mすることにより、上記の例が有効であると動作します。テーブルのサイズによっては、「ブラインドアップデート」を避けると、非常に大きなテーブルでパフォーマンスの問題が発生する可能性があります。 IF EXISTS()内のテーブルヒントに注意してください。

IF EXISTS(
     SELECT 
      * 
     FROM 
      ValTable v WITH(NOLOCK) 
      INNER JOIN StringTable s WITH(NOLOCK) ON v.str_key = s.str_key 
     WHERE 
      s.String = 'a' 
     AND v.other_key = 1 
    ) 
BEGIN 
    UPDATE 
     v 
    SET  
     val = 2.124 
    FROM  
     ValTable v 
     INNER JOIN StringTable s ON v.str_key = s.str_key 
    WHERE 
     s.String = 'a' 
    AND v.other_key = 1 
END 
ELSE 
BEGIN 
    INSERT INTO ValTable 
     --(You should define your columns here, You didn't provide a sample schema so I don't know what your columns are.) 
     --(Col1,COl2,COl3,etc...) 
    SELECT 
     str_key, 1, 2.124 
    FROM  
     StringTable 
    WHERE 
     String = 'a' 
END