仅当两列或多列匹配时选择-postgresql

仅当两列或多列匹配时选择-postgresql,sql,postgresql,Sql,Postgresql,我正在自学SQL,而且我对编码还很陌生。 我需要一个脚本的帮助,这个脚本从几个表中选择数据,将其插入到另一个已经有数据的表中。 但是,如果4列中有2列不匹配,我只想将数据插入第二个表中 以下是我插入表1之前选择的数据示例: warehouse │ section │ division │ division_code 1 │ 10 │ 1 │ BOXES 1 │ 11 │ 1 │ CRATES

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

以下是我插入表1之前选择的数据示例:

warehouse   │  section    │   division   │  division_code

  1       │   10   │   1     │   BOXES
  1       │   11   │   1     │   CRATES
  1       │   12   │   1     │   LANES
  2       │   3    │   1     │   OFFICE
下面是我想插入到表2中的表中的数据示例:

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中,其中不存在warehouse和division_代码列的组合。本例中的两行为:

  1       │   11   │   1     │   CRATES
  2       │   3    │   1     │   OFFICE
我尝试了使用Exception,但这不起作用,因为section列是不同的,我不确定如何使用not IN或not EXISTS,因为在这种情况下,有2列需要检查

非常感谢您的帮助! 谢谢

试试这个:

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上的主整数键。 请记住,我没有测试这个,所以您需要修改它。我对SQL也有些陌生。此解决方案可能完全错误且不起作用,您必须自己检查

基本理解是:

将表1加载到临时表中 在那张临时桌上转一圈 使用“不存在”,将“表1上的选择”左键连接到表2。 如果表2中不存在这两列,请直接从表1中插入它们。
SQL的好处之一是,您可以用几乎相同的方式来表达您的需求

我只想将表1中的行插入表2中,其中不存在warehouse和division_代码列的组合

在PostgreSQL中,您可以使用行语法以更方便的方式执行此操作:

insert into table2
select * from table1
where (table1.warehouse, table1.division_code) not in (
  select table2.warehouse, table2.division_code from table2)

选择左键连接warehouse和division_代码上的两个表,其中表2上的任何列都为nulltmp是SQL Server语法。。这个问题用PostgreSQL标记。我甚至没有注意到,谢谢你的更正。将其转换为PostgreSQL将使OP的学习体验更加有趣!SQL是声明性语言,但您的方法是算法;2从表1中选择1左连接表2。。。without where子句将始终返回非空表1的数据,因此不存在。。。在你的回答中将永远是错误的;3您没有初始化/更改代码中的@count变量;4是的,您的答案是关于MS SQL的,它在许多情况下不符合SQL标准。结论:你的答案是完全错误的。这非常有效!我不知道我可以将NOT IN与多个参数一起使用。非常感谢你的帮助,我学到了很多lot@ShaniP. 实际上,它是一个复合参数,因为有括号。祝你学习顺利:
-- 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)
insert into table2
select * from table1
where (table1.warehouse, table1.division_code) not in (
  select table2.warehouse, table2.division_code from table2)