No.4ベストアンサー
- 回答日時:
#1,#3です。
>内部的には、一度テーブル結合し、Test2.tt3='AA'を探しだしているということですかね。
>その上で更新しているのでしょうか。
考え方としては近いです。
ただし、実際に確認してみると、SQL Serverのオプティマイザは以下の通りもっと性能がよく、「各レコードの更新回数がn回になるだけ」というのは正しくなかったので訂正させていただきます。
----------------------------------------------------------------------------------------------------------------
データを少し変えて重複させ、どういうプランで実行するか見てみます。
Test1
t1 t2
1 A --t1=1を2件いれます
1 A --t1=1を2件いれます
2 B
Test2
tt1 tt2 tt3 tt4
1 1 AA X --t1=1を2件いれます(ただしtt4には別の値を)
1 1 AA Y --t1=1を2件いれます(ただしtt4には別の値を)
1 2 BB Z
2 1 CC W
SET STATISTICS PROFILE ON
GO
UPDATE Test1
SET t2=b.tt4--敢えてTest2のtt4で更新させてみます。
FROM Test1 a
INNER JOIN Test2 b ON b.tt1=a.t1 AND b.tt3='AA'
GO
Rows Executes StmtText
2 1 UPDATE Test1 SET t2=b.tt4 FROM Test1 a INNER JOIN Test2 b ON b.tt1=a.t1 AND b.tt3='AA'
2 1 |--Table Update(OBJECT:([Test1]), SET:([Test1].[t2] = [Expr1006]))
2 1 |--Top(ROWCOUNT est 0)
0 0 |--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(varchar(2),[Test2].[tt4] as [b].[tt4],0)))
2 1 |--Stream Aggregate(GROUP BY:([Bmk1000]) DEFINE:([b].[tt4]=ANY([Test2].[tt4] as [b].[tt4])))
4 1 |--Nested Loops(Inner Join, WHERE:([Test2].[tt1] as [b].[tt1]=[Test1].[t1] as [a].[t1]))
3 1 |--Table Scan(OBJECT:([Test1] AS [a]))
6 3 |--Table Scan(OBJECT:([Test2] AS [b]), WHERE:([Test2].[tt3] as [b].[tt3]='AA'))
SELECT * FROM Test1
GO
t1 t2
1 X
1 X
2 B
----------------------------------------------------------------------------------------------------------------
この通り、
1)「Test1」と「Test2のうちtt3='AA'のもの」を結合して、4行を得る
(Test1とTest2両方にt1=1のものを2行ずつ入れましたから、2×2に重複されて4行になります。
2)ただ、更新するのはTest1のうちの2行なので、2行を2回ずつ更新するのは無駄。したがって集約して2行にしてしまう
このときに「ANY([Test2].[tt4] as [b].[tt4])」とあるように、tt4の値が複数あったら任意の1つ(つまりXかYかどちらか)にしてしまいます。
3)最後に2行を任意のtt4(例えばX)で更新する。
データ件数が多くなると、集約方法が「並び替え+DISTINCT」になったりしますが、基本的な考え方は変わらないようです。
以上、ご参考まで。
大変丁寧な解説、ありがとうございます。
単純な結合ではなくて、更新行を集約(並び替え+DISTINCT)してたりするということで、あらためて難しさを確認できました。
参考にさせていただきます。_(__)_
No.3
- 回答日時:
#1です。
>一般にテーブルを結合した場合、1:1か1:nの1側しか更新できません。
少なくともSQL Serverをお使いであれば、これはあてはまりません。
特に今回の場合、Test2のフィールドの値でTest1のフィールドを更新するわけではなく、'D'という1つの固定値で更新するわけですから、仮にn:nであっても問題ないです(各レコードの更新回数がn回になるだけ)。
ありがとうございます。
また、ひとつ確認があります。
>nであっても問題ないです(各レコードの更新回数がn回になるだけ)。
ということは内部的には、一度テーブル結合し、
Test2.tt3='AA'を探しだしているということですかね。
その上で更新しているのでしょうか。
No.2
- 回答日時:
DBが何か分からないのですが、一般にテーブルを結合した場合、
1:1か1:nの1側しか更新できません。よって、Test1のt1が
一意である保証がないと更新できません。
ありがとうございます。
そうなんですね、結合されてupdateをかけたことがないので、
とても参考になります。
DBは、sqlserverとなります。
確認ですが、
>1:1か1:nの1側しか更新できません。
とありますが、1側のキー=t1,t2,t3で
n側のキー=t1,t2,t3,t4,t5であれば、
1側は更新できますか?
※複数のキーがある場合でも更新できるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- 物理学 温度 T1, T2の二つの熱源間の間に可逆サイクルを働かせるとき、出入りする熱量をQ1, Q2とする 2 2023/06/30 09:30
- 物理学 文字説明になってしまうのですがすいません。物理の問題です。 重さWの荷物を吊るす。 重さを吊るしたと 2 2023/07/06 02:40
- レディース アニエス・ベーについて教えてください。 Tシャツのサイズ表記に1.2.3のほかにT1.T2.T3とT 1 2022/05/17 18:13
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- Excel(エクセル) Excelのマクロについて 2 2022/06/14 03:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外部結合+合計を出したい
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
SELECT 文 GROUP での1件目を...
-
access2021 VBA メソッドまたは...
-
エクセルで最後の文字だけ置き...
-
datetime型でNULL値を入れたい。
-
重複していないレコードの抽出...
-
Oracleのデータ型、NUMBERについて
-
EXISTSを使ったDELETE文
-
カーソル0件の時にエラーを発生...
-
INSERT文でフィールドの1つだ...
-
for whichの使い方
-
COBOL プログラミング
-
PL/SQLの変数について
-
access2003 クエリSQL文に...
-
パワーポイントのアドインのソ...
-
エクセルVBAでEdate関数は使え...
-
過剰なオブジェクト指向脳から...
-
リストビューの項目の内容を変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
BULKINSERTのWITHオプションに...
-
SQLServerでtime型への変換
-
片方のテーブルに無いデータを...
-
Access 2000 サブクエリとJOIN
-
日付型項目のNULLについて(Pos...
-
VBA 100億になると#が自動...
-
データ突合のよい方法を教えて...
-
【SQL】指定期間の合計、MAX...
-
SQL文について
-
DatePartを関数使うと、スペー...
-
テーブルの結合(GROUP BY句の制...
-
sql express内部結合して重複行...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
for whichの使い方
-
SQLで特定の項目の重複のみを排...
-
INSERT文でフィールドの1つだ...
おすすめ情報