2016-03-08 104 views
-2

我有一張表,我需要從具有2個條件的視圖中插入數據: 1)將這些數據插入表中,pk在事務表中不可用但在查看2)如果pk存在,但數據與視圖不同,則插入這些數據也SQL查詢存在且不存在

 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

有什麼問題你嘗試的解決方案? – Shadow

+0

'case'表達式的語法是錯誤的。事實上,刪除'案件時,它可能工作。 – shawnt00

+0

即使在刪除大小寫之後,它給我的語法錯誤 –

回答

1

我相信這是適合您的INSERTSELECT Netezza的正確格式。我刪除無效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表的別名。

+0

錯誤[HY000]錯誤:(2)不支持這種形式的相關查詢 - 考慮重寫 –

+0

這看起來很奇怪,當你離開'OR EXISTS'部分時'SELECT'部分沒有插入而運行嗎?如果是這樣,也許它不允許重用表別名,並且'OR EXISTS'需要是'q'以外的東西。在黑暗中拍攝,不知道Netezza。 –

+0

是的。只有當我運行第二個條件時,問題出現 –

1

作爲一般規則,相關子查詢不適用於Netezza。很顯然,你可以在很多情況下使用它們,但通常是以將MPP平臺變成串行處理器爲代價的。壞。

你可以重寫你的插入方式,但這對我來說似乎是最清楚的。我不知道這個邏輯想要做什麼,但我仍然複製它。如果view包含重複內容,則可能有問題;這可以通過對數據更多的瞭解來解決。

insert into tableA (
    a 
    ,b 
    ,c 
    ,d 
) 
select 
    viw.a 
    ,viw.b 
    ,viw.c 
    ,viw.d 
from 
    view viw 
    join tableA tba on 
    (viw.a = tba.a) 
    or (
     viw.a = tba.a 
     and viw.b <> tba.b 
     or viw.c <> tba.c 
     or viw.d <> tba.d 
    ) 

您可以通過從實際的表插入tableA刪除查看重複的可能性和使用的rowid在那裏發現。也許是這樣的:

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

然後收集rowids插入,像這樣:

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;