从草稿表中,仅插入不带';不存在于新表中。PostgreSQL
我有两个包含相同列的表。一个是我需要用作中间数据保持器的临时表,另一个是我的最终表从草稿表中,仅插入不带';不存在于新表中。PostgreSQL,sql,postgresql,Sql,Postgresql,我有两个包含相同列的表。一个是我需要用作中间数据保持器的临时表,另一个是我的最终表 CREATE TABLE scratch_table ( a text, b text ); CREATE TABLE final_table ( a text, b text ); scratch_表有以下三行: a | b -----------|------------ 'text a 1' | 'text b 1' 'text a 2' | 'tex
CREATE TABLE scratch_table (
a text,
b text
);
CREATE TABLE final_table (
a text,
b text
);
scratch_表有以下三行:
a | b
-----------|------------
'text a 1' | 'text b 1'
'text a 2' | 'text b 2'
'text a 3' | 'text b 3'
最后的_表有两行:
a | b
-----------|-----------
'text a 1' | 'text b 1'
'text a 4' | 'text b 4'
我需要编写一个查询,获取scratch_表中的所有行,并只插入最终_表中不存在的行。最终表格末尾应为:
a | b
-----------|-----------
'text a 1' | 'text b 1'
'text a 2' | 'text b 2'
'text a 3' | 'text b 3'
'text a 4' | 'text b 4'
只有行'text a4','text b4'
从零开始插入到final\u表中,因为它以前不存在
请注意,我使用的数字(1-4)并不表示任何顺序,我只想区分每行上的数据。谢谢 有两种方法可以做到这一点,这里有一种方法是使用
not exists
:
insert into final_table
select a, b
from scratch_table st
where not exists (
select 1
from final_table ft
where ft.a = st.a and ft.b = st.b
)
这将插入scratch_表
中不存在于final_表
中的任何记录,在a
和b
字段中匹配
INSERT INTO final_table (a,b)
SELECT a, b
FROM scratch_table
EXCEPT
SELECT a, b
FROM final_table
EXCEPT运算符将只返回不同的行。如果不想删除重复项,请使用除所有之外的
。是否有意将a列和b列中的值配对?只检查一列可以吗?谢谢!现在,我的实际表格有13行。我只使用了一个2行的小表格来说明我的情况。你给我的答案很好,但我需要很多答案(13!)。很抱歉,我以前没有详细说明这一点。有没有更干净的方法来达到同样的效果?@LuisC——我不确定我是否理解?为什么需要13个和子句SELECT 1
并不意味着选择第一行,它只意味着选择是否匹配(您可以轻松地说SELECT*
)。它应该适用于您的整个表。@LuisC--BTW,这里有一篇关于除了
和不存在之间的性能差异的好文章(以及一些其他方法)。