2016-05-04 14 views
1

Ich habe 2 Tabellen und eine verschachtelte Tabelle:Oracle SQL - fusioniert Tabelle mit verschachtelter Tabelle als Spalte

1.stores Daten über Produkte, die folgenden Spalten enthalten:

 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- temporäre Tabelle mit neuem Rabatte sind Spalten:

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

Was ich tun muß, ist Tabelle 2 zu 1 Tisch verschmelzen - wenn keine Übereinstimmung sonst ignoriert einfügen (wenn Übereinstimmung ist: Ihre gesuchte Produkt-ID in der Tabelle 1 und 2 und für diesen Artikel Unter Tabelle PROMOTIONID Spiel PROMOTIONID aus Tabelle 2)

Dies ist, wo ich so weit gekommen, und ich habe Schwierigkeiten mit verschachtelten Teil - ON-Klausel und Insert-Klausel

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

Ich weiß, dass das ist falsch, aber ich kann nicht überall finden, wie es

Beispiel zu tun: Preise Tabelle:

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

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

neue Promo Tabelle:

(15,1, .. ....)

(11,1,)

neuer Promo mit der ID 15 wird hinzugefügt, um zu Row1 und row2

und Promo mit id 11 nicht

Bitte helfen hinzugefügt werden , Danke

+0

Gerade UNNEST der geschachtelten Tabelle eine Abfrage wie folgt aus: SELECT ITEM, x * FROM table1 t1, TABLE (t1.DISCOUNTS) x' und als Unterabfrage in MERGE-Anweisung verwenden, wie jede andere gewöhnliche Abfrage.. – krokodilko

Antwort

0

Was Sie beabsichtigen zu tun ist nicht wirklich eine MERGE. Sie fügen in jedem Datensatz, der ihn nicht enthält, ein neues Angebot hinzu.

Im Folgenden finden Sie eine Antwort, wie Sie sich nähern würden, wenn Sie keine geschachtelte Tabelle, sondern eine herkömmliche untergeordnete Tabelle verwenden würden.

Setup (auf ein Minimum vereinfacht)

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; 

Das erste, was Sie finden müssen, die Aktionen für ein Element fehlen. Verwenden Sie eine Cross-Join alle Kombination zu bekommen und diese Aktionen, die EXISTS für einen bestimmten ITEM_ID einschränken:

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

Dies gibt erwartet als

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

Jetzt einfach diese neuen Aktionen hinzufügen

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

Dies sollten Ihnen einen Hinweis geben, wie zu nähern, während verschachtelte Tabellen (oder wie das DB-Design ändern :)

Verwandte Themen