下記のSQLの本にあった例題で、なんでそうなるのか分からないところがあります。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS) ミック https://www.amazon.co.jp/dp/4798157821/ref=cm_sw_r_tw_dp_U_x_gjAmEb7S0JHQ4
以下のtableAに対して、
name | price |
---|---|
aaa | 50 |
bbb | 100 |
bbb | 100 |
bbb | 100 |
ccc | 40 |
下記のSQLを実行するとbbbの重複がなくなります。
SQL
1delete from tableA t1 2 where rowid < (select max(t2.rowid) 3 from tableA t2 4 where t1.name = t2.name 5 and t1.price = t2.price);
以下のテーブルによって、nameのaaaはwhereのところで1<1
という判定になって、Falseが返りaaaが残らないと思うのですが、なぜ残るのでしょうか。
rowid | name | price |
---|---|---|
1 | aaa | 50 |
2 | bbb | 100 |
3 | bbb | 100 |
4 | bbb | 100 |
5 | ccc | 40 |
同じようにnameのbbbは、2<4
と3<4
がTrueになって残り、4<4
はFalseになって残らない、つまりbbbは2行残ると思うのですが、なぜ1行になるのでしょうか。
また、下記のSQLでも同じように重複が削除されるようですが、
SQL
1delete from tableA t1 2 where exists (select * 3 from tableA t2 4 where t1.name = t2.name 5 and t1.price = t2.price 6 and t1.rowid < t2.rowid);
t1.rowid < t2.rowid
でどのような動きになっているのでしょうか。
ご教示の程何卒よろしくお願いいたします。
【追記】
DBの種類が変わってしまうのですが、Redshiftで下記のSQLを試したところ、
SQL
1CREATE TABLE tableA ( 2 idx int, 3 name char(5), 4 price int 5); 6 7INSERT INTO tableA VALUES(1, 'a', 50); 8INSERT INTO tableA VALUES(2, 'b', 100); 9INSERT INTO tableA VALUES(3, 'b', 100); 10INSERT INTO tableA VALUES(4, 'b', 100); 11INSERT INTO tableA VALUES(5, 'c', 40); 12 13SELECT 14 * 15FROM 16 tableA t1 17WHERE EXISTS 18 (SELECT 19 1 20 FROM 21 tableA t2 22 WHERE 23 t1.name = t2.name 24 AND t1.price = t2.price 25 AND t1.idx < t2.idx 26 );
以下の結果になりました。
idx | name | price |
---|---|---|
2 | b | 100 |
3 | b | 100 |
この結果は僕の理解通りで、t1.idx < t2.idx
の評価がTrueのところが残っています。
回答2件
あなたの回答
tips
プレビュー