Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / сравнение записи двух таблицы postgresql / 9 сообщений из 9, страница 1 из 1
16.11.2016, 08:40
    #39348054
Alib
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
Здравствуйте!
Мне нужен сравнить записи двух таблицы. Структура таблицы похоже. Вот таблицы:
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
16.11.2016, 12:46
    #39348304
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
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
16.11.2016, 13:28
    #39348342
Slider_spb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
Я бы сделал UNION этих записей, а потом посчитал количество строк в результирующем запросе, если = 1, значит равны.
...
Рейтинг: 0 / 0
17.11.2016, 07:15
    #39348780
Alib
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
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
17.11.2016, 07:15
    #39348781
Alib
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
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
17.11.2016, 13:45
    #39349095
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
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
17.11.2016, 14:46
    #39349150
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
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
17.11.2016, 15:12
    #39349172
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение записи двух таблицы postgresql
qwwq,

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

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

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


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