4

3 つのテーブルがあります。他の 2 つのテーブルからデータを計算して、3 番目のテーブルの列を更新する必要があります。

update table3 set column3=
(
select t2.column3+t1.column3
from table2 t2 with (nolock) join table1 t1
on table2.id=t1.id
where table2.id= 100
)
where id= 100;

このクエリは正常に機能し、3 番目のテーブル列を更新しますが、次のような IN 演算子を指定すると:

  update table3 set column3=
    (
    select t2.column3+t1.column3
    from table2 t2 with (nolock) join table1 t1
    on table2.id=t1.id
    where table2.id IN (100,101)
    )
    where id IN (100,101);

これは失敗し、このメッセージが表示されます

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。ステートメントは終了されました。

これは、サブクエリが複数の行を返すためだとわかっていますが、このシナリオをどのように処理できますか? ヒント/考えは役に立ちます。

複数の ID を更新するにはどうすればよいですか? すなわち。ID 100 によって返される選択クエリの値は、3 番目のテーブルの ID 100 に対して更新する必要があります。ID 101 についても同様です。

また、この sum(t2.column3)- (t1.column3 + t1.column2) のような合計を行う必要があります

 update table3 set column3=
        (
        select  sum(t2.column3)- (t1.column3 + t1.column2)
        from table2 t2 with (nolock) join table1 t1
        on table2.id=t1.id
        where table2.id IN (100,101)
        )
        where id IN (100,101);
4

2 に答える 2

6

これはcolumn3、返された結果に設定しようとしており、SQL はそれが 1 つの値 (スカラー) であると想定しているためです。複数の戻り値を渡すと、SQL エンジンは混乱します (どれを使用する必要がありますか?...結果を反復処理することを想定していません)。したがって、結果セット全体を更新する場合は、クエリからサブテーブルを作成して結合する必要があります。クエリは次のようになります

UPDATE Table3
SET Column3 = subtable.value
FROM Table3 
    JOIN (
        select t2.column3+t1.column3 as value, t1.id
        from table2 t2 with (nolock) join table1 t1
        on table2.id=t1.id
        where table2.id IN (100,101)
    ) AS subtable
    ON subtable.id = Table3.id
WHERE table3.id IN (100, 101)

table3.id が他の ID と一致するというこの仮定の下では、実際には内部の ID も必要ありません。where table2.id IN ...

于 2012-05-11T19:12:08.027 に答える
1

にも参加する必要がありtable3ますUPDATE。これを試して:

UPDATE t3
SET column3 = t2.column3+t1.column3
FROM table3 t3
INNER JOIN table2 t2 WITH(NOLOCK) 
ON t3.id = t2.id
INNER JOIN table1 t1
ON t3.id=t1.id
WHERE t3.id IN (100,101)
于 2012-05-11T19:13:05.170 に答える