2016-05-04 1 views
1

У меня 2 таблицы и одну вложенную таблицу:Oracle SQL - объединить таблицу с вложенной таблицы в колонке

1.stores данных о продуктах, которые включают в себя следующие столбцы:

 ITEM - product id(key) 
    STORE - store id(key) 
    PRICE 
    NORMAL_PRICE 
    DISCOUNTS - nested table with info about discounts include columns: 
      PromotionId(key) 
      PromotionDescription 
      PromotionEndDate 
      MinQty 
      DiscountedPrice 
      DiscountedPricePerMida 

2- временную таблицу с новыми скидки включают столбцы:

PROMOTIONID(key) 
PRODUCTID(key) 
PROMOTIONDESCRIPTION 
PROMOTIONENDDATE 
MINQTY 
DISCOUNTEDPRICE 
DISCOUNTEDPRICEPERMIDA 

Что мне нужно сделать, является объединить таблицу 2 в таблице 1 - если совпадение не вставить еще игнорировать (если матч: соответствие идентификатор продукта в таблице 1 и 2, и для этого продукта к югу матч таблицы PROMOTIONID PROMOTIONID из таблицы 2)

Это где я до сих пор и у меня есть трудности с вложенной частью - на п и вставить Пункт

MERGE INTO PRICES P 
USING(SELECT * FROM TMP_PROMO)T 
ON(P.ITEM=T.PRODUCTID AND P.STORE=50 AND P.DISCOUNTS.PROMOTIONID=T.PROMOTIONID) 
WHEN NOT MATCHED THEN INSERT (P.DISCOUNTS) 
     VALUES(T.PROMOTIONID, 
       T.PROMOTIONDESCRIPTION, 
       T.PROMOTIONENDDATE, 
       T.MINQTY, 
       T.DISCOUNTEDPRICE, 
       T.DISCOUNTEDPRICEPERMIDA); 

Я знаю, что это неправильно, но я нигде не могу найти, как это сделать

пример: Цены таблице:

row1 (1,50, ..., nested_table [(11, ...), (12 , ...)])

row2 (2,50, ..., nested_table [(10, ...), (12, ...)])

новый промо-стол:

(15,1, .. .)

(11,1, ...)

новый промо с идентификатором 15 будет добавлено в row1 и row2

и промо с идентификатором 11 не будет добавлен

Пожалуйста, помогите , спасибо

+0

Просто отключите вложенную таблицу, используя такой запрос: 'SELECT ITEM, x. * FROM table1 t1, TABLE (t1.DISCOUNTS) x' и использовать его как подзапрос в инструкции MERGE, как и любой другой обычный запрос. – krokodilko

ответ

0

То, что вы намереваетесь сделать, это не реально MERGE. Вы добавляете новую рекламу в каждую запись, которая не содержит ее.

Ниже приведен ответ о том, как ю будет приближаться к нему, если вы используете не вложенную таблицу, а обычную дочернюю таблицу.

Setup (упрощена до минимума)

create table ITEM 
(ITEM_ID NUMBER PRIMARY KEY); 

create table ITEM_PROMO 
(ITEM_ID NUMBER REFERENCES ITEM(ITEM_ID), 
PROMO_ID NUMBER); 

create table TMP_PROMO 
(PROMO_ID NUMBER); 

insert into ITEM values (1); 
insert into ITEM values (2); 

insert into ITEM_PROMO values (1,11); 
insert into ITEM_PROMO values (1,12); 
insert into ITEM_PROMO values (2,10); 
insert into ITEM_PROMO values (2,12); 

insert into TMP_PROMO values (15); 
insert into TMP_PROMO values (11); 

commit; 

Первое, что вам нужно найти это, какие рекламные акции отсутствуют для элемента. Используйте крест зарегистрироваться, чтобы получить все комбинации и ограничить те акции, которые EXISTS для конкретного ITEM_ID:

select ITEM.ITEM_ID, TMP_PROMO.PROMO_ID 
from ITEM cross join TMP_PROMO 
where NOT EXISTS (select NULL from ITEM_PROMO where ITEM_ID = ITEM.ITEM_ID and PROMO_ID = TMP_PROMO.PROMO_ID) 
; 

Это дает, как и ожидалось

ITEM_ID PROMO_ID 
---------- ---------- 
     2   11 
     1   15 
     2   15 

Теперь просто добавить эти новые акции

INSERT INTO ITEM_PROMO 
select ITEM.ITEM_ID, TMP_PROMO.PROMO_ID 
from ITEM cross join TMP_PROMO 
where NOT EXISTS (select NULL from ITEM_PROMO where ITEM_ID = ITEM.ITEM_ID and PROMO_ID = TMP_PROMO.PROMO_ID) 
; 

Это должно дать вам подсказку, как подойти при использовании вложенных таблиц (или как изменить дизайн БД :)

Смежные вопросы