powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / сравнение записи двух таблицы postgresql
9 сообщений из 9, страница 1 из 1
сравнение записи двух таблицы postgresql
    #39348054
Alib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Мне нужен сравнить записи двух таблицы. Структура таблицы похоже. Вот таблицы:
CREATE TABLE md2
(
id bigserial NOT NULL,
sguid character varying,
hard character varying,
soft character varying,
netid character varying,
packnum bigint,
ctime timestamp with time zone,
tname character varying,
vinterval bigint,
datevalues integer[],
CONSTRAINT md2_pkey PRIMARY KEY (id)
)

CREATE TABLE md3
(
id bigserial NOT NULL,
sguid character varying,
hard character varying,
soft character varying,
netid character varying,
packnum bigint,
ctime timestamp with time zone,
tname character varying,
vinterval bigint,
datevalues integer[],
CONSTRAINT md3_pkey PRIMARY KEY (id)
)

Я примерно так сделал, но результат не то... обновляет поле datevalues один и тот же данными

select count(*) as ii into ri from md3 where sguid=new.sguid and soft=new.soft and hard=new.hard and netid=new.netid and tname=new.tname;

IF ri.ii > 0 THEN
if q.sguid=new.sguid and q.soft=new.soft and q.hard=new.hard and q.netid=new.netid and q.tname=new.tname then
update md3 set datevalues = a.datevalues || new.datevalues
from md3 a
where a.sguid=new.sguid and a.soft=new.soft and a.hard=new.hard and a.netid=new.netid and a.tname=new.tname;
end if;
ELSE
insert into md3 (sguid, hard, soft, netid, packnum, ctime, tname, vinterval, datevalues) values(new.sguid,new.hard,new.soft,new.netid,
new.packnum,new.ctime, new.tname, new.vinterval, new.datevalues);
END IF;

Заранее спасибо!
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39348304
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alib,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
UPDATE md3
SET 
  sguid = md2.sguid,
  hard = md2.hard,...
FROM
  md2
WHERE
  md3.id = md2.id AND
  (md3.sguid, md3.hard, ...) IS DISTINCT FROM (md2.sguid, md2.hard, ...);

INSERT INTO md3 (
  id,
  sguid,
  hard,
  ...
) 
SELECT
  id,
  sguid,
  hard,
  ...
FROM
  md2
WHERE
  NOT EXISTS (
    SELECT 1
    FROM
      md3
    WHERE
      md3.id = md2.id
  );

DELETE FROM md3
WHERE
  NOT EXISTS (
    SELECT 1
    FROM
      md2
    WHERE
      md2.id = md3.id
  );


как-то так наверное...
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39348342
Slider_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сделал UNION этих записей, а потом посчитал количество строк в результирующем запросе, если = 1, значит равны.
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39348780
Alib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

Я извиняюсь, что задачу не правильно объяснил. Я по русский плохо владею. Общем, если значение вот этих 5 колонок (q.sguid=new.sguid and q.soft=new.soft and q.hard=new.hard and q.netid=new.netid and q.tname=new.tname) равны, то в колонке datevalues надо делать конкатенацию. А если не равно, тогда данные записывать на новою строку.

И еще раз извиняюсь!!!
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39348781
Alib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slider_spb,

Я извиняюсь, что задачу не правильно объяснил. Я по русский плохо владею. Общем, если значение вот этих 5 колонок (q.sguid=new.sguid and q.soft=new.soft and q.hard=new.hard and q.netid=new.netid and q.tname=new.tname) равны, то в колонке datevalues надо делать конкатенацию. А если не равно, тогда данные записывать на новою строку.
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39349095
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alib,

ну так, с небольшими изменениями используем уже имеющиеся код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
UPDATE md3
SET datevalues = array_cat(md3.datevalues, md2.datavalues)
FROM md2
WHERE
   (md3.sguid=md2.sguid and md3.soft=md2.soft and md3.hard=md2.hard and md3.netid=md2.netid and md3.tname=md2.tname);

INSERT INTO md3 (
  sguid,
  hard,
  soft,
  ...
)
SELECT
  sguid,
  hard,
  soft,
  ...
FROM
  md2
WHERE
  NOT EXISTS (
    SELECT 1
    FROM
      md3
    WHERE
      (md3.sguid=md2.sguid and md3.soft=md2.soft and md3.hard=md2.hard and md3.netid=md2.netid and md3.tname=md2.tname)
  );


как-то так. при условии, что ни один из этих пяти полей не содержит значения NULL;
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39349150
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibесли значение вот этих 5 колонок (q.sguid=new.sguid and q.soft=new.soft and q.hard=new.hard and q.netid=new.netid and q.tname=new.tname) равны

тут немного собака порылась, не смотря на русский и степень его понимания.

бытовое понимание (NULL "равно" NULL)=true.
т.к. нормального оператора (скажем "is") для такого понимания не существует, в ПЖ используется "псевдооператор" IS NOT DISTINCT FROM

или "математическое понимание (NULL "=" NULL) IS NULL

в каком из двух смыслов -- бытовом ("совпадает") или математическом ("=") вам надо сравнивать 5 полей ?


и да, из за того , что IS [NOT] DISTINCT FROM не умеет (не умел) пользоваться подходящими индексами его лучше расписывать по операторно. для множества полей это немного скучно
Код: sql
1.
2.
3.
 (A.x=B.x OR (A.x IS NULL AND B.x IS NULL))
AND 
 (A.y=B.y OR (A.y IS NULL AND B.y IS NULL))

...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39349172
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

в данном случае, имеется сильные подозрения, что индексов там только один на таблицу (id), посему из дистинкт фром, думаю, подходит.
...
Рейтинг: 0 / 0
сравнение записи двух таблицы postgresql
    #39349908
Alib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

ДВС!!! Спасибо за помощь!!!

Все нормально работает, но когда обновляет записывает личные записи. Например, место одного конкатенации делает 4 конкатенации. в поле должно было 2 элемента, а там 5 элемент. Еще раз спасибо!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / сравнение записи двух таблицы postgresql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]