我自己学习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。
任何帮助将不胜感激! 谢谢!
答案 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也有些陌生。该解决方案可能完全错误且无法正常工作,您必须自己检查一下。
基本理解是: