37

次の構文について質問があります。これを 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サーバーを使用しています。ありがとう

4

4 に答える 4

46

これを試してみてください。これは、複数の選択を組み合わせて、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
于 2013-06-05T06:01:22.400 に答える
10

実行する更新を含む一時テーブルまたはテーブル変数をUPDATE作成してから、テーブルを更新するテーブルにリンクするステートメントを実行できます。

INSERT2 つの更新の場合、更新テーブルへのステートメントとUPDATEステートメント自体の 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;
于 2013-06-05T06:50:01.287 に答える