2017-03-09 17 views
0

假設f是一個字符串函數,如0連接:f(0011)= 00110。SQL更新:這樣的行...?

假設mytable具有列string這是一個索引和price

我願做類似下面的僞代碼:

UPDATE mytable SET price(X)=0.5 FOR ALL THOSE ROWS X SUCH THAT 
THE ROW Y SUCH THAT THE `string` OF Y equals f(the `string` FOR X) 
HAS price(Y)=0 

更一般地,我怎麼可以參考

「行,使得[條件成立,也就是說,取決於在當前行]「

in(My)SQL?

+0

我猜觸發器會在這裏工作 – minigeek

+0

哇......不是那麼容易嗎? –

+0

這應該只是一個'WHERE'子句,可能是一個自連接。我並不確定我是否瞭解這種情況,您能否顯示一些樣本數據和預期結果? – Barmar

回答

1

設置演示

CREATE TABLE mytable 
(id   INT UNSIGNED NOT NULL PRIMARY KEY 
, thestring VARCHAR(32) 
, price  DECIMAL(11,2) 
) ENGINE=INNODB 
; 
INSERT INTO mytable (id, thestring, price) VALUES 
(1,'0011' , 123.45) 
,(2,'00110' , 45.67) 
,(3,'001100' , 0.00) 
,(4,'10'  , 4.44) 
,(5,'100' , 5.55) 
,(6,'1000' , 0.00) 
; 

編寫標識MYTABLE

SELECT y.* 
    FROM `mytable` `y` 
WHERE y.price = 0.0 
ORDER BY y.id 

在Y行的查詢添加一個連接到MYTABLE找到匹配的X行

SELECT x.id   AS x_id 
    , x.thestring AS x_thestring 
    , x.price  AS x_price 
    , y.id   AS y_id 
    , y.thestring AS y_thestring 
    , y.price  AS y_price 
    FROM mytable `y` 
    JOIN mytable `x` 
    ON CONCAT(x.thestring,'0') = y.thestring 
WHERE y.price = 0.0 
ORDER BY y.id 

將SELECT轉換爲UPDATE。 (替換SELECT ... FROM與UPDATE和WHERE子句前添加一個SET子句。

UPDATE mytable `y` 
    JOIN mytable `x` 
    ON CONCAT(x.thestring,'0') = y.thestring 
    SET x.price = 0.5 
WHERE y.price = 0.0 

只是f(x.thestring)更換CONCAT(x.thestring,'0')


另一種選擇是使用相關子查詢。

首先,寫一個SELECT

SELECT x.* 
    FROM mytable `x` 
WHERE EXISTS (SELECT 1 
        FROM mytable `y` 
       WHERE y.thestring = f(x.thestring) 
        AND y.price = 0.00 
      ) 

的然後將其轉換爲UPDATE。將SELECT ... FROM替換爲UPDATE關鍵字,並在WHERE子句前添加SET子句。

UPDATE mytable `x` 
    SET x.price = 0.5 
WHERE EXISTS (SELECT 1 
        FROM mytable `y` 
       WHERE y.thestring = f(x.thestring) 
        AND y.price = 0.00 
      ) 
1

使用帶自聯接的UPDATE

UPDATE mytable AS x 
JOIN mytable AS y ON y.string = f(x.string) 
SET x.price = 0.5 
WHERE y.price = 0 
+0

哦,那很好。 –