仅在两个或更多列匹配时选择-postgresql

时间:2018-09-20 20:01:14

标签: sql postgresql

我自己学习SQL,并且对编码还很陌生。 我正在编写的脚本需要帮助,该脚本可以从几个表中选择数据,然后将其插入到已经有数据的另一个表中。 但是,如果4列中有2列不匹配,我只想将数据插入第二个表中。

这是我插入(table1)之前来自select数据的示例:

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中,在该表中仓库和divide_code列的组合不存在。情况下的两行是:

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

我尝试使用EXCEPT,但是鉴于section列不同,因此无法使用,并且在需要检查2列的情况下,我不确定在这种情况下如何使用NOT IN或NOT EXISTS。

任何帮助将不胜感激! 谢谢!

3 个答案:

答案 0 :(得分:1)

尝试一下:

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

答案 1 :(得分:1)

SQL的优点之一是您可以使用几乎相同的方式来表达您的需求。

  

我只想将表1中的行插入到表2中,而仓库和division_code列的组合不会退出。

-- 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)

答案 2 :(得分:-1)

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

如果还不需要,则在table1上需要一个主整数键(对于此解决方案)。 请记住,我没有对此进行测试,因此您需要对其进行修改。我对SQL也有些陌生。该解决方案可能完全错误且无法正常工作,您必须自己检查一下。

基本理解是:

  • 您将table1加载到临时表中
  • 遍历该临时表
  • 对表1的选择(左连接到表2)使用NOT EXIST。
  • 如果表2中不存在2列,则直接从table1中插入它们。