Мой запрос дублирует строки, когда я импортирую файл CSV в таблицу:
+----------+----------------+---------------------+
| fullname | formattedvalue | recordTime |
+----------+----------------+---------------------+
| text1 | 170.01346 | 09/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text2 | 24.153432536 | 09/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text3 | 3.583432424 | 09/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text1 | 170.01346 | 08/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text2 | 24.153432536 | 08/02/2020 21:45:00 |
+----------+----------------+---------------------+
| text3 | 3.583432424 | 08/02/2020 21:45:00 |
+----------+----------------+---------------------+
И Запрос:
CREATE TEMP TABLE tmp_x
(
"fullname" varchar,
"formattedvalue" double precision,
"recordtime" timestamp
);
COPY tmp_x FROM PROGRAM 'more +1 "D:\MEAS_20200308x.csv"' (FORMAT csv, DELIMITER ',');
--UPDATE tmp_x
--SET formattedvalue = ROUND( CAST(formattedvalue as numeric), 3 );
insert into meas_kanal select * from (
select x.*
from tmp_x x
left outer join meas_kanal t on t.fullname = x. fullname AND t. recordtime = x. recordtime
where t. fullname is null AND t. recordtime is null
) as missing;
DROP TABLE tmp_x;
Мой лог c должен проверять наличие дубликатов в cloumn комбинация: fullname
+ recordtime
Когда я снова запускаю запрос, он снова вставляет те же строки.
Есть идеи, где я не прав?
РЕДАКТИРОВАТЬ 2:
Я пытался и это с той же проблемой:
INSERT INTO meas_kanal
SELECT x.*
FROM tmp_x x
LEFT OUTER JOIN meas_kanal t ON (t. fullname = x. fullname AND t. recordtime = x. recordtime)
WHERE t.fullname IS NULL AND t. recordtime IS NULL;
РЕДАКТИРОВАТЬ 3: Один больше не удалось.
INSERT INTO meas_kanal
SELECT *
FROM tmp_x
WHERE NOT EXISTS(SELECT *
FROM meas_kanal
WHERE (tmp_x.fullname=meas_kanal.fullname and
tmp_x.recordtime=meas_kanal.recordtime)
);
Я думаю, что проблема в другом месте.
Редактировать 4: Возможное решение
Кстати, я забыл упомянуть. У меня нет первичного ключа. Теперь я делаю два:
CREATE TEMP TABLE tmp_x
(
"fullname" varchar,
"formattedvalue" double precision,
"recordtime" timestamp,
UNIQUE (fullname, recordtime)
);
И эту вставку:
insert into meas_kanal(fullname, formattedvalue,recordtime)
SELECT fullname, formattedvalue,recordtime FROM tmp_x x
ON CONFLICT DO NOTHING;
Пока все работает так, как я ожидал. Я напишу это решение как ответ, если никто не даст лучшего решения.