2013-06-05 7 views
11

次の構文に関する質問があります。これを2つではなく1つのステートメントにロールアップする、よりクリーンな方法がありますか?私はいくつかの反復を試みましたが、これがこれらの2つのステートメントを正常に実行できる唯一の方法と思われます。複数の行を更新する文を更新

UPDATE employee 
SET hire_date = '1979-03-15' 
WHERE emp_id = 'PMA42628M' 

UPDATE employee 
SET hire_date = '1988-12-22' 
where emp_id = 'PSA89086M'; 

私もこれを試しましたが、私もANDステートメントを使って試しました。どちらもうまくいかなかった。基本的には、上記の方法よりも初心者ではない方法を探しています。私は長い時間をかけて検索し、見つけませんでした。

UPDATE employee 
SET hire_date = ('1979-03-15', '1988-12-22') 
WHERE emp_id = ('PMA42628M', 'PSA89086M'); 

私はSQL Serverを使用しています。 おかげ

答えて

18

彼らはDBから来たかのように、これは、複数の選択を組み合わせ、それらを返します。この方法を試してください。

UPDATE e 
SET hire_date = t.hire_date 
FROM dbo.employee e 
JOIN (
    SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15' 
    UNION ALL 
    SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22' 
) t ON t.emp_id = e.emp_id 

は、SQL Server 2008以降のバージョンを使用している場合は、あなたはまた、別のを使用することができます派生テーブルの構文は:

UPDATE e 
SET hire_date = t.hire_date 
FROM dbo.employee e 
JOIN (
    VALUES 
     ('PMA42628M', '1979-03-15'), 
     ('PSA89086M', '1988-12-22') 
) t (emp_id, hire_date) ON t.emp_id = e.emp_id 
+0

「AS」は2回欠けていませんか? – Zim84

+0

このような状況では、不要なので 'AS'キーワードは使用しません。 – Devart

+0

@ Zim84レビューをいただきありがとうございます。 – Devart

7

私はあまり初心者道

を探しています3210

2つの別々の更新ステートメントを実行することは(私によれば)「初心者ではない方法」であるので、複雑になり、このようなことを行うことができます。

update employee 
set hire_date = case emp_id 
        when 'PMA42628M' then '1979-03-15' 
        when 'PSA89086M' then '1988-12-22' 
       end 
where emp_id in ('PMA42628M', 'PSA89086M') 

しかし、あなたは何を得ますか?更新全体が1つの暗黙的なトランザクションで実行されるので、2つの更新をトランザクションに入れたい場合は、begin transaction .... commitを使用します。

+0

私はこの1分の間に約100Kの更新ステートメントを実行する低速(対話型)アプリケーションを最適化する方法を探していました。 。提案されたような組み合わせのバリエーションに切り替えると、約700%のスピードアップが得られ、同じ作業を10秒以内で実行できます。それを大文字にすることは、時間の大部分を占めるすべてのSQLステートメントのディスパッチとラウンドトリップ時間であるため、これをすべて翻訳に入れることは役に立ちません。 – flodin

3

すでに言及した他の方法を追加するには、実行する更新を含む一時テーブルまたはテーブル変数を作成してから、更新する予定のテーブルにテーブルをリンクするUPDATEステートメントを実行します。

2つの更新プログラムの場合、更新テーブルへのINSERTUPDATEステートメント自体の2つのステートメントがあります。文の数は2つのままですが、多くの更新が必要です。

CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL); 
INSERT INTO #employee (emp_id,hire_date) 
VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05'); 

CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL); 
INSERT INTO #target_updates (emp_id,hire_date) 
VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22'); 

UPDATE 
    #employee 
SET 
    hire_date=tu.hire_date 
FROM 
    #employee AS e 
    INNER JOIN #target_updates AS tu ON 
     tu.emp_id=e.emp_id; 

SELECT 
    * 
FROM 
    #employee 
ORDER BY 
    emp_id; 

DROP TABLE #target_updates; 
DROP TABLE #employee; 
+1

このshdは、既に存在するテーブルからn個の行を更新する場合 –