2016-05-04 8 views
1

としてネストされたテーブルでテーブルをマージ割引は列が含まれます:私がする必要がどのようなのOracle SQLは、私は2つのテーブルと一つのネストされたテーブルを有するカラム

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

は、表1に表2をマージしている - マッチがあるとき誰一致インサート( を無視していない場合:表中の製品IDのマッチング1と2と表2から、本製品のサブテーブルpromotionIDはマッチpromotionIDは用)

私がこれまでに得た場所ですし、私は、ネストされた一部の難しさを持っている - ON句と句

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、...、11(nested_table [、...)、(12 、...)])

ROW2(2,50、...、nested_table [(10、...)、(12、...)])

新しいプロモーションテーブル:

(15,1、.. 。)

(11,1、...)

ID 15で新しいプロモーションは、ID 11で

やプロモーションをROW1とROW2に追加されます

を追加されません助けてください、 ありがとう

+0

'SELECT ITEM、x。* FROM table1 t1、TABLE(t1.DISCOUNTS)x'のような問合せを使用してネストした表をネスト解除すると、他の通常の問合せと同様にMERGE文の副問合せとして使用できます。 – krokodilko

答えて

0

本当にマージではありません。それを含まない各レコードに新しいプロモーションを追加しています。

以下は、ネストしたテーブルではなく従来の子テーブルを使用する場合のアプローチです。 (最小限のように簡略化)

セットアップは

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; 

あなたが見つける必要がある最初の事はプロモーションアイテムのために不足しているです。 すべての組み合わせを得るために参加し、クロスを使用し、それらのプロモーション特定のITEM_IDためEXISTS制約:

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

これは、ネストしたテーブルを使用しているとき(またはDBデザインを変更する方法)にアプローチする方法をヒントにします。

関連する問題