PostgreSQL - помогает сравнить две таблицы с тремя конкретными столбцами - PullRequest
0 голосов
/ 14 мая 2019

Мне нужно сопоставить три столбца в двух таблицах. Запрос должен выбрать строку в t1 и найти любую строку в t2, где ВСЕ три столбца, перечисленные ниже, совпадают.

tbl_staged_documentation (t1 for reference)
orgname|name|subnet|customerid|customername|ipaddress|prefix

tbl_active_networks (t2 for reference)
orgid|ipaddress|prefixlength|sitename|siteid|name

Вот три столбца

t1.customerid = t2.orgid
t1.ipaddress = t2.ipaddress
t1.prefix = t2.prefixlength

Я посмотрел в JOIN и UNION. Похоже, UNION может вырвать дубликаты, но я не смог их достать. Ни присоединиться.

Похоже, что один из этих двух вариантов - путь, но я не знаю, как это сделать.

select *
from tbl_staged_documentation t1
join tbl_active_networks t2
  on t1.customerid = t2.orgid
  and t1.ipaddress = t2.ipaddress
  and t1.prefix = t2.prefixlength
where
  t1.customerid = t2.orgid AND t1.ipaddress != t2.ipaddress AND t1.prefix != t2.prefixLength;

Также попробовал следующее UNION

select customerid, ipaddress, prefix from tbl_staged_documentation
union
select orgid, ipaddress, prefixlength from tbl_active_networks;

В конечном итоге я пытаюсь выяснить, какой сетевой информации из t1 не существует в t2. T1 является источником истины. t2 содержит данные в производственной системе.

Данные из t1 будут динамически обновляться до t2, но из-за жесткого ограничения скорости в системе, откуда поступают данные t2, я пытаюсь очистить их перед выполнением вызовов API.

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Я пытаюсь выяснить, какой сетевой информации из t1 не существует в t2

Это именно то, для чего предназначен оператор NOT EXISTS:

select *
from tbl_staged_documentation t1
where not exists (select *
                  from tbl_active_networks t2
                  where t1.customerid = t2.orgid
                    and t1.ipaddress = t2.ipaddress
                    and t1.prefix = t2.prefixlength)
0 голосов
/ 15 мая 2019

@ a_horse_with_no_name должно быть правильным.

Дополнительная информация о выражениях подзапроса , включая (НЕ) СУЩЕСТВУЕТ и (НЕ) IN.

0 голосов
/ 14 мая 2019

Не уверен на 100% в вашем вопросе, но я думаю, что вам может понадобиться "анти-соединение", например:

select t1.*
from tbl_staged_documentation t1
left join tbl_active_networks t2
  on t1.customerid = t2.orgid
  and t1.ipaddress = t2.ipaddress
  and t1.prefix = t2.prefixlength
where t2.orgid is null

То есть:

  • Используйте условие соответствия:

    t1.customerid = t2.orgid
    t1.ipaddress = t2.ipaddress
    t1.prefix = t2.prefixlength
    
  • Чтобы найти все строки в t1, которые не имеют совпадающих строк в t2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...