2016-03-08 2 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' неверен. Фактически удалите «case when», и это, вероятно, работает. – shawnt00

+0

Даже после удаления случая он дает мне синтаксическую ошибку –

ответ

1

Я считаю, что это правильный формат для вашего INSERT с SELECT для 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 
    ) 
) 

Edit: Я думаю, что это, возможно, жаловались на повторное использование псевдонима q таблицы.

+0

ОШИБКА [HY000] ОШИБКА: (2) Эта форма коррелированного запроса не поддерживается - рассмотрите возможность перезаписи –

+0

. Кажется странным, выполняется ли операция 'SELECT' без вставки, когда вы покидаете раздел' ИЛИ EXISTS'? Если это так, возможно, это не позволяет повторно использовать псевдоним таблицы, а «OR EXISTS» должен быть чем-то иным, чем 'q'. Просто выстрелы в темноте, не знаю, нетэцца. –

+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;