Выберите, только если совпадают 2 или более столбцов - postgresql - PullRequest
0 голосов
/ 20 сентября 2018

Я изучаю SQL самостоятельно, и я довольно новичок в кодировании.Мне нужна помощь с сценарием, который я пишу, который выбирает данные из нескольких таблиц, чтобы вставить их в другую таблицу, в которой уже есть данные.Тем не менее, я хочу вставить данные во вторую таблицу только в том случае, если 2 из 4 столбцов НЕ совпадают.

Ниже приведен пример данных, выбранных перед вставкой (таблица1):

warehouse   │  section    │   division   │  division_code

  1       │   10   │   1     │   BOXES
  1       │   11   │   1     │   CRATES
  1       │   12   │   1     │   LANES
  2       │   3    │   1     │   OFFICE

Вот пример данных в таблице, в которую я хочу вставить (table2):

warehouse   │  section    │   division   │  division_code

  1       │   1    │   1     │   BOXES
  1       │   2    │   1     │   LANES
  1       │   3    │   1     │   FUSES
  1       │   4    │   1     │   OFFICE
  2       │   1    │   1     │   LANES
  2       │   2    │   1     │   CRATES

Я только хочу вставить строки из таблицы 1 в таблицу 2, где комбинациястолбцы хранилища и кода_доставки не выходят.Две строки в этом случае:

  1       │   11   │   1     │   CRATES
  2       │   3    │   1     │   OFFICE

Я пытался с EXCEPT, но это не работает, учитывая, что столбец раздела отличается, и я не уверен, как использовать NOT IN или NOT EXISTS в этомслучай с учетом 2 столбцов, которые необходимо проверить.

Любая помощь очень ценится!Спасибо!

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018
declare @count int
select * into #tmp from table1

while exists (select * from #tmp)
begin


IF NOT EXISTS(SELECT 1 FROM table1 t1 left join table2 t2 on t1.warehouse=t2.warehouse and t1.division_code=t2.division_code)
    INSERT INTO table2
    select * from t1 where PrimaryKeyID=@count

delete from #tmp where PrimaryKeyID=@count
end 
drop table #tmp

Вам понадобится первичный целочисленный ключ в таблице 1, если вы этого еще не сделали (для этого решения).Имейте в виду, я не проверял это, поэтому вам нужно будет изменить его.Я также немного новичок в SQL.Это решение может быть полностью неправильным и не функциональным, вам придется проверить его самостоятельно.

Основное понимание состоит в том, что:

  • Вы загружаете table1 во временную таблицу
  • Цикл по этой временной таблице
  • Использовать NOT EXIST с выбором на таблице 1, оставленной присоединенной к таблице 2.
  • Если 2 столбца не существует в таблице 2, вставьте их правильноиз таблицы 1.
0 голосов
/ 21 сентября 2018

Одним из преимуществ SQL является то, что вы можете выразить свое требование, используя его почти таким же образом.

Я только хочу вставить строки из таблицы 1 в таблицу 2, где комбинация хранилищаи столбцы с делением-кода не завершаются.

-- I only want to insert the rows from table 1 into table 2 ...
insert into table2
select * from table1
-- where ... doesn't exits
where not exists (
  select 1 
  from table2
  -- the combination of warehouse and division_code columns
  where
    table2.warehouse = table1.warehouse and
    table2.division_code = table1.division_code)

В PostgreSQL вы можете сделать это еще более удобным способом, используя синтаксис строки:

insert into table2
select * from table1
where (table1.warehouse, table1.division_code) not in (
  select table2.warehouse, table2.division_code from table2)
0 голосов
/ 20 сентября 2018

Попробуйте это:

INSERT INTO table2
    SELECT * FROM table1 t1
    LEFT JOIN table2 t2
    ON t1.warehouse = t2.warehouse
    AND t1.division_code = t2.division_code
    --Any column
    WHERE t2.division_code IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...