甲骨文 |从具有一对多关系的表中检索记录
Oracle | Retrieval of records from tables having One to many relationship
我有两个共享一对多关系的 table。 MY_FACT
是父项 table,而 MY_RMDETAILS
是子项 table,对于一个父项记录有多个记录。
Table MY_FACT:
FACT_ID
FACT_DATE
TOTAL_DEMAND
1000
21/04/2022
500
2000
21/04/2022
500
Table MY_RMDETAILS:
RM_ID
FACT_ID
PROMISE_QTY
REQUEST_QTY
RM_ITEM_NAME
200
1000
500
500
RM1
201
1000
400
500
RM2
202
1000
500
500
RM3
203
1000
400
500
RM4
300
2000
500
500
RM1
301
2000
500
500
RM2
302
2000
500
500
RM3
303
2000
500
500
RM4
我需要编写一个查询以获得以下输出。
逻辑:
如果MY_RMDETAILS.PROMISE_QTY
小于MY_RMDETAILS.REQUEST_QTY
,供应不足。
因此,对于任何给定的 MY_FACT
记录,如果其来自 MY_RMDETAILS
的任何子记录的 PROMISE_QTY
小于 REQUEST_QTY
,则标志 SUPPLY_SUFFICIENT
在输出中应该是 N
否则它应该是 Y
.
并且输出中的 INSUFFICIENT_RMs
列应以逗号分隔格式显示 MY_RMDETAILS.RM_ITEM_NAME
个“不足”记录。
预期输出:
FACT_ID
FACT_DATE
TOTAL_DEMAND
SUPPLY_SUFFICIENT?
INSUFFICIENT_RMs
1000
21/04/2022
500
N
RM2,RM4
2000
21/04/2022
500
Y
请帮忙。提前致谢。
您可以尝试使用带条件聚合函数的子查询。
SELECT t2.*,
CASE WHEN t1.INSUFFICIENT_cnt > 0 THEN 'N' ELSE 'Y' END,
t1.INSUFFICIENT_RMs
FROM (
SELECT FACT_ID,
LISTAGG(CASE WHEN PROMISE_QTY < REQUEST_QTY THEN RM_ITEM_NAME END, ', ') WITHIN GROUP (ORDER BY RM_ID) INSUFFICIENT_RMs,
COUNT(CASE WHEN PROMISE_QTY < REQUEST_QTY THEN RM_ITEM_NAME END) INSUFFICIENT_cnt
FROM MY_RMDETAILS
GROUP BY FACT_ID
) t1 INNER JOIN MY_FACT t2
ON t1.FACT_ID = t2.FACT_ID
我有两个共享一对多关系的 table。 MY_FACT
是父项 table,而 MY_RMDETAILS
是子项 table,对于一个父项记录有多个记录。
Table MY_FACT:
FACT_ID | FACT_DATE | TOTAL_DEMAND |
---|---|---|
1000 | 21/04/2022 | 500 |
2000 | 21/04/2022 | 500 |
Table MY_RMDETAILS:
RM_ID | FACT_ID | PROMISE_QTY | REQUEST_QTY | RM_ITEM_NAME |
---|---|---|---|---|
200 | 1000 | 500 | 500 | RM1 |
201 | 1000 | 400 | 500 | RM2 |
202 | 1000 | 500 | 500 | RM3 |
203 | 1000 | 400 | 500 | RM4 |
300 | 2000 | 500 | 500 | RM1 |
301 | 2000 | 500 | 500 | RM2 |
302 | 2000 | 500 | 500 | RM3 |
303 | 2000 | 500 | 500 | RM4 |
我需要编写一个查询以获得以下输出。
逻辑:
如果MY_RMDETAILS.PROMISE_QTY
小于MY_RMDETAILS.REQUEST_QTY
,供应不足。
因此,对于任何给定的 MY_FACT
记录,如果其来自 MY_RMDETAILS
的任何子记录的 PROMISE_QTY
小于 REQUEST_QTY
,则标志 SUPPLY_SUFFICIENT
在输出中应该是 N
否则它应该是 Y
.
并且输出中的 INSUFFICIENT_RMs
列应以逗号分隔格式显示 MY_RMDETAILS.RM_ITEM_NAME
个“不足”记录。
预期输出:
FACT_ID | FACT_DATE | TOTAL_DEMAND | SUPPLY_SUFFICIENT? | INSUFFICIENT_RMs |
---|---|---|---|---|
1000 | 21/04/2022 | 500 | N | RM2,RM4 |
2000 | 21/04/2022 | 500 | Y |
请帮忙。提前致谢。
您可以尝试使用带条件聚合函数的子查询。
SELECT t2.*,
CASE WHEN t1.INSUFFICIENT_cnt > 0 THEN 'N' ELSE 'Y' END,
t1.INSUFFICIENT_RMs
FROM (
SELECT FACT_ID,
LISTAGG(CASE WHEN PROMISE_QTY < REQUEST_QTY THEN RM_ITEM_NAME END, ', ') WITHIN GROUP (ORDER BY RM_ID) INSUFFICIENT_RMs,
COUNT(CASE WHEN PROMISE_QTY < REQUEST_QTY THEN RM_ITEM_NAME END) INSUFFICIENT_cnt
FROM MY_RMDETAILS
GROUP BY FACT_ID
) t1 INNER JOIN MY_FACT t2
ON t1.FACT_ID = t2.FACT_ID