1

我有 2 个表和一个嵌套表:

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 中的产品 id 匹配以及此产品子表 PROMOTIONID 匹配表 2 中的 PROMOTIONID)

到目前为止,这是我在嵌套部分遇到困难的地方 - ON 子句和 Insert 子句

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,...)

id 为 15 的新促销将添加到 row1 和 row2

并且不会添加 id 为 11 的促销

请帮忙,谢谢

4

1 回答 1

0

您打算做的并不是真正的 MERGE。您在每条不包含它的记录中添加一个新的促销。

下面是一个答案,如果您不使用嵌套表而是使用传统的子表,您将如何处理它。

设置(简化到最低限度)

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

这应该给您提示如何在使用嵌套表时进行处理(或如何更改数据库设计:)

于 2016-05-04T16:34:38.240 回答