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