我想以相當複雜的方式更新一個表,並且決定將內表連接到它自己的表是有用的。 (爲了給出一些背景,表格存儲通過chain_id字段鏈接的記錄的短鏈,並且在鏈中通過日期字段進行排序。更新需要處理具有與日期不同的最近日期的符號。其他人在其鏈中,也可能需要將一些鏈分成多個單獨的鏈)。在MySQL中更新一個表內連接本身
這是我所看到的一個簡化版本:
CREATE TABLE t(
`a` INT(3) NOT NULL,
`b` INT(3)
);
INSERT INTO t VALUES (3,4),(3,6);
SELECT * FROM t;
------------
| a | b |
-------------
| 3 | 4 |
| 3 | 6 | as expected
UPDATE t t1
INNER JOIN t t2
ON (t1.a = t2.a
AND t1.b > t2.b)
SET t1.b = t1.a
AND t2.b = t1.a;
SELECT * FROM t;
------------
| a | b |
-------------
| 3 | 4 |
| 3 | 0 | wat
我本來希望得到是:
------------
| a | b |
-------------
| 3 | 3 |
| 3 | 3 |
所以很明顯,這是個不錯的計劃,但讓我有三個問題:
1.)這裏發生了什麼事?
2.)由於無論發生什麼事情都不太可能是預期的,MySQL爲什麼會允許它?
3)是否有另一種方式來實現類似我的本意(即實際更新的表內加入了與自身,不只是把一切都設置爲3 ...)
更新與本身的內部連接的表是(在我看來)一個非常糟糕的主意。你很可能有深度未知的層次結構,因此最好的方法是(假設MySQL不支持遞歸查詢)實現一個簡單的遞歸函數,在每個**鏈**中找到合適的值,並且在遞歸完全倒回時,更新撥款記錄。 – FDavidov