SQL查询存在且不存在

时间:2016-03-08 01:15:34

标签: mysql sql netezza

我有一个表,我需要从有两个条件的视图中插入数据: 1)将这些数据插入到一个表中,其中pk在事务表中不可用但在视图中可用2)如果pk在那里但数据与视图不同,那么也插入这些数据

        Insert into table A
    a,
    b,
    c,
    d
SELECT 
a,
b,
c,
d
from View sa
WHERE not Exists 
(Select * FROM table A q
    where SA.a = q.a )
    OR 
    CASE WHEN  Exists
    (Select * FROM table A q
    where SA.a = q.a 
    AND 


                        SA.b <> q.b
                        OR SA.c <> q.c
                        OR SA.d <> q.d
                    ) 

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

我认为这是适用于Netezza的INSERTSELECT的正确格式。我删除了无效的CASE表达式,应该没有其他语法错误,但不确定逻辑:

Insert into tableA (a,b,c,d) (
SELECT a,b,c,d
from View sa
WHERE not Exists 
   (Select * FROM tableA q
    where SA.a = q.a 
    )
 OR Exists
    (Select * FROM tableA q2
    where SA.a = q2.a 
    AND SA.b <> q2.b
     OR SA.c <> q2.c
     OR SA.d <> q2.d
    )
)

编辑:我认为它可能一直在抱怨重新使用q表别名。

答案 1 :(得分:1)

作为一般规则,相关子查询不适用于Netezza。显然,您可以在许多情况下使用它们,但通常以将MPP平台转换为串行处理器为代价。坏。

您可以通过多种方式重写插入内容,但这似乎对我来说最清楚。我不知道这个逻辑试图做什么,但我仍然复制了它。如果tableA包含重复项,您可能会遇到问题;这可以通过更多的数据知识来解决。

create temporary table temp_view as
  select * from view
distribute on (some_key);

您可以通过从实际表中插入rowids并使用在那里找到的rowid来消除查看重复项的可能性。也许是这样的:

insert into tableA (
  a
  ,b
  ,c
  ,d
)
with mar as ( --Match 'a' records.
  select
    viw.rowid insert_rowid
  from
    temp_view viw
    join tableA tba using (a)
), mnb as ( --Match against 'b'
  select
    viw.rowid
  from
    temp_view viw
    join tableA tba on 
      viw.a = tba.a
      and viw.b <> tba.b
      or viw.c <> tba.c
      or viw.d <> tba.d
), rws as ( --All rowids.
  select * from mar
  union select * from mnb
)
select
  a
  ,b
  ,c
  ,d
from
  temp_view viw
  join rws on rws.insert_rowid = viw.rowid;

然后收集{{1}}进行插入,如下所示:

{{1}}