【问题标题】:oracle sql - merge table with nested table as columnoracle sql - 将带有嵌套表的表合并为列
【发布时间】:2016-08-30 03:45:35
【问题描述】:

我有两张表和一张嵌套表:

1.存储有关产品的数据,包括以下列:

     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 的新促销将添加到第 1 行和第 2 行

不会添加 id 为 11 的促销

请帮忙, 谢谢

【问题讨论】:

  • 只需使用如下查询取消嵌套表:SELECT ITEM, x.* FROM table1 t1, TABLE( t1.DISCOUNTS ) x 并将其用作 MER​​GE 语句中的子查询,就像任何其他普通查询一样。

标签: sql oracle oracle12c nested-table sql-merge


【解决方案1】:

您打算做的并不是真正的 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)
;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2023-03-23
    • 2021-04-10
    相关资源
    最近更新 更多