Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从草稿表中,仅插入不带';不存在于新表中。PostgreSQL_Sql_Postgresql - Fatal编程技术网

从草稿表中,仅插入不带';不存在于新表中。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
字段中匹配


EXCEPT运算符是ANSI SQL。它接受两个集合,只返回第一个集合中第二个集合中不存在的行

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,这里有一篇关于
除了
不存在之间的性能差异的好文章(以及一些其他方法)。