Ошибка слияния в операторе «Слияние» - PullRequest
0 голосов
/ 22 января 2020

Я получаю следующую ошибку при попытке выполнить оператор SQL "Merge Into" в Postgres:

"ОШИБКА: синтаксическая ошибка в или около" MERGE ".

Мы находимся Postgres 12.

Вот SQL, который вы можете использовать для тестирования. SET AUTOCOMMIT = ON;

/* Drop tables when done testing... */
-- DROP TABLE Stock;
-- DROP TABLE Buy;
-- DROP TABLE Sale;

/* Build Tables */

CREATE TABLE STOCK(ITEM_ID INT UNIQUE, BALANCE INT);
INSERT INTO STOCK VALUES (10, 2200);
INSERT INTO STOCK VALUES (20, 1900);


CREATE TABLE BUY(ITEM_ID INT, VOLUME INT);
INSERT INTO BUY VALUES(10, 1000);
INSERT INTO BUY VALUES(30, 300);


CREATE TABLE SALE(ITEM_ID INT, VOLUME INT);
INSERT INTO SALE VALUES (10, 2200);
INSERT INTO SALE VALUES (20, 1000);

/* Test out Merge Statement */

MERGE INTO Stock USING Buy ON Stock.item_id = Buy.item_id
WHEN MATCHED THEN UPDATE SET Stock.balance = Stock.balance + Buy.volume
WHEN NOT MATCHED THEN INSERT VALUES (Buy.item_id, Buy.volume);
;

1 Ответ

2 голосов
/ 22 января 2020

Как указано в руководстве, Postgres не имеет оператора слияния.

Вам нужно использовать INSERT ON CONFLICT вместо

insert into stock (item_id, balance)
select item_id, volume
from Buy 
on conflict (item_id) do
  update SET stock.balance = stock.balance + excluded.volume;
...