0

別のテーブル (TableB) の値を使用してテーブル (TableA) を更新するクエリを作成しています。テーブル B は、TableA の各行に対して複数の値を返し、要求は TableB の最大の戻り値で更新することです。

私はこれを達成することができます:

UPDATE TableA 
SET Value = (SELECT TOP 1 B.Value FROM dbo.TableB B
                WHERE TableA.Key = B.Key
                ORDER BY B.Value desc)

要求を達成するための最良の方法であるかどうかはわかりません。さらに、上記のクエリのパフォーマンスが心配です。テーブル B を複数回スキャンして、テーブル A の各行の値を見つけますか?

私はいくつかのクエリを試しました。

update tableA
set Value = TableB.Value
from (Table A left join Table B ... where ...)

2 番目の方がパフォーマンスが良いと思いますが、" をサポートしていないため、最大の値を取得できませんorder by"

テーブル B を 2 回結合し、B の値を比較すると問題が解決する可能性がありますが、最初のクエリよりもパフォーマンスが低下する可能性があります。

何か案は?

** 実際の状況は例よりも複雑です。たとえば、tableA と tableB が "....or....or...or..." で結合する必要がある場合は、さらにコストがかかります。

4

2 に答える 2

1

INNER JOINの最大値を取得するサブクエリをagaintsで使用しますtableB

UPDATE  a
SET     a.Value = b.max_val
FROM    tableA a
        INNER JOIN 
        (
            SELECT  key, MAX(VALUE) max_val
            FROM    tableb
            GROUP   BY  key
        ) b ON a.key = b.key
于 2013-01-23T11:50:19.070 に答える
1

あなたが示した例では相関サブクエリを使用しているため、 A の各行に対してサブクエリが実行されます。次のように、クエリで TableA を 2 回使用することで、相関サブクエリを回避できます。

UPDATE TableA 
SELECT TableA.Col1 = t2.Col1, TableA.Col2 = TableB.Col
FROM TableA t2
INNER JOIN TableB ON ...
于 2013-01-23T11:51:45.820 に答える