我有一个表,我需要从有两个条件的视图中插入数据: 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
)
任何帮助表示赞赏!
答案 0 :(得分:1)
我认为这是适用于Netezza的INSERT
和SELECT
的正确格式。我删除了无效的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}}