我有一个挑战,我必须建立一些查询,我对如何开始有点迷失.我想我可能需要使用分区来实现这一点,但不确定他们的方式.所以,如果有人可以与我分享知识:)
首先抱歉令人困惑的tittle,但老实说,不知道如何用一行描述它:(
问题是我有两张桌子:
库存
ITEM QTY PRIORITY
-----------------------------
ITEM1 10 1
ITEM1 5 2
ITEM1 4 3
ITEM1 7 4
ITEM2 4 1
ITEM2 19 2
Run Code Online (Sandbox Code Playgroud)
LIST
ITEM QTY
-----------------
ITEM1 17
ITEM2 13
Run Code Online (Sandbox Code Playgroud)
我需要实现的逻辑是表LIST从INVENTORY表中删除了数量.但它必须按项目执行并删除优先级中的数量.例如:
在LIST表中,我们有ITEM1 = 17这意味着我们需要按照优先级顺序删除Inventory表中的这个数量.
因此ITEM1的结果如下:
ITEM QTY PRIORITY
-----------------------------
ITEM1 0 1
ITEM1 0 2
ITEM1 2 3
ITEM1 7 4
Run Code Online (Sandbox Code Playgroud)
如果将整个逻辑应用于所有项目,则生成的查询应返回如下内容:
ITEM QTY PRIORITY
-----------------------------
ITEM1 0 1
ITEM1 0 2
ITEM1 2 3
ITEM1 7 4
ITEM2 0 1
ITEM2 10 2
Run Code Online (Sandbox Code Playgroud)
有人知道我怎么能接近这个?
Oracle安装程序:
CREATE TABLE inventory ( item, qty, priority ) AS
SELECT 'ITEM1', 10, 1 FROM DUAL UNION ALL
SELECT 'ITEM1', 5, 2 FROM DUAL UNION ALL
SELECT 'ITEM1', 4, 3 FROM DUAL UNION ALL
SELECT 'ITEM1', 7, 4 FROM DUAL UNION ALL
SELECT 'ITEM2', 4, 1 FROM DUAL UNION ALL
SELECT 'ITEM2', 19, 2 FROM DUAL;
CREATE TABLE list ( item, qty ) AS
SELECT 'ITEM1', 17 FROM DUAL UNION ALL
SELECT 'ITEM2', 13 FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
查询:
MERGE INTO inventory dst
USING (
SELECT i.item,
LEAST(
GREATEST(
SUM( i.qty ) OVER ( PARTITION BY i.item ORDER BY i.priority )
- COALESCE( l.qty, 0 ),
0
),
i.qty
) AS qty,
i.priority
FROM inventory i
LEFT OUTER JOIN
list l
ON ( i.item = l.item )
) src
ON ( src.item = dst.item AND src.priority = dst.priority )
WHEN MATCHED THEN
UPDATE SET qty = src.qty;
Run Code Online (Sandbox Code Playgroud)
输出:
SELECT * FROM inventory;
ITEM QTY PRIORITY
----- --- --------
ITEM1 0 1
ITEM1 0 2
ITEM1 2 3
ITEM1 7 4
ITEM2 0 1
ITEM2 10 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |