Mysql

MySQL 中這個 Postgres 查詢的正確語法是什麼?

  • July 14, 2018

我有一個在我們的 PostgreSQL 數據庫中執行良好的查詢,但我們現在還需要在 MySQL 數據庫上執行我們的應用程序

該查詢採用一個 ID 和位置數組,並使用給定 ID 更新每個記錄,並為相應位置更新一個新值。

 UPDATE items
   SET position = i_vals.position 
   FROM (VALUES (1,12), (2, 13), (3,11)) AS i_vals(id, position)
   WHERE i_vals.id = items.id;

如何將此查詢重寫為對 MySQL 和 SQLite3 友好?作為獎勵,我希望能夠使用相同的查詢在 PostgreSQL 中執行,但很感激這可能是不可能的

有可能

UPDATE items, ( SELECT 1 id, 12 position UNION ALL 
               SELECT 2   , 13          UNION ALL
               SELECT 3   , 11                    ) i_vals
SET items.position = i_vals.position 
WHERE i_vals.id = items.id;

或者:

UPDATE items
      JOIN   ( SELECT 1 id, 12 position UNION ALL 
               SELECT 2   , 13          UNION ALL
               SELECT 3   , 11                    ) i_vals
      ON  i_vals.id = items.id;
SET items.position = i_vals.position ;

在 SQL 標準中,沒有辦法在更新語句中連接兩個表。

重寫您的陳述的通用方法是:

UPDATE items
 SET position = case id
                  when 1 then 12
                  when 2 then 13
                  when 3 then 11
                end
where id in (1,2,3);

然而,這對修改不太靈活,但應該在任何 DBMS 上執行。

引用自:https://dba.stackexchange.com/questions/212109