92

私はこのような単純なテーブル構造を持っています:

テーブルtempData

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║    80 ║
║ Ravi     ║    85 ║
║ Sanjay   ║    90 ║
╚══════════╩═══════╝

また、このようなtempDataViewとして別のテーブル名もあります

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Ravi     ║       ║
║ Ravi     ║       ║
║ Sanjay   ║       ║
╚══════════╩═══════╝

tempDataView比較したName - Name に応じてマークを設定することにより、テーブルtempDataViewを更新したい

はい、私が試したことをお見せしましょう。カーソルを使用してこれを解決しようとしましたが、完全に解決されましたが、サブクエリを使用して解決する方法を見つけています。

ここにあります:

Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert

実際、サブクエリを使用してそれを解決するのは宿題のようなものです。

4

5 に答える 5

201

UPDATEステートメントでも両方のテーブルを結合できます。

UPDATE  a
SET     a.marks = b.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

パフォーマンスを向上させるには、両方のテーブルINDEXにon列を定義します。marks

を使用してSUBQUERY

UPDATE  tempDataView 
SET     marks = 
        (
          SELECT marks 
          FROM tempData b 
          WHERE tempDataView.Name = b.Name
        )
于 2013-01-31T04:52:01.197 に答える
39

学習しているだけなので、SELECT結合をUPDATEまたはDELETE結合に変換する練習をすることをお勧めします。まず、次の2つのテーブルを結合するSELECTステートメントを生成することをお勧めします。

SELECT *
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

a次に、2つのテーブルエイリアスと。があることに注意してくださいb。これらのエイリアスを使用すると、テーブルaまたはbのいずれかを更新するUPDATEステートメントを簡単に生成できます。表aについては、JWから提供された回答があります。更新するb場合、ステートメントは次のようになります。

UPDATE  b
SET     b.marks = a.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

ここで、ステートメントをDELETEステートメントに変換するには、同じアプローチを使用します。以下のステートメントはa、名前で一致するレコードについてのみ(bをそのままにして)から削除します。

DELETE a
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

JWが作成したSQLフィドルを遊び場として利用できます

于 2013-01-31T05:00:12.100 に答える