我想要一个带有连接的查询和另一个使用第一个查询的输出作为输入的查询的联合。
我尝试创建一个存储过程并循环遍历游标并在临时表中逐个插入数据,但速度非常慢。如果您想查看该程序,请告诉我。
我的第一个问题是:
SELECT od.ID,
od.CUST_PO_NUM,
od.CUST_STATUS,
TO_CHAR(od.SHIP_DATE,'DD-MON-YY') AS SHIP_DATE,
od.A_PART_NUM,
TO_CHAR(REQUIRED_DATE,'DD-MON-YY') AS REQUIRED_DATE,
SUM(NVL(ct.SHIPPED_QTY, 0)) AS SHIPPED_QTY,
TO_CHAR(od.CUR_ACKED_DATE,'DD-MON-YY') AS CUR_ACKED_DATE,
TO_CHAR(od.DOCK_DATE,'DD-MON-YY') AS DOCK_DATE,
TO_CHAR(od.POD_DATE,'DD-MON-YY') AS POD_DATE,
od.SHIP_TO,
od.UNIT_PRICE,
od.ITEM_TOTAL,
od.SHIP_FROM,
od.REQUIRED_DATE_LASTCHG_DT,
od.DOCK_DATE_LASTCHG_DT,
od.CUST_STATUS_LASTCHG_DT,
od.ROUTING_CODE,
TO_CHAR(od.ENTERED_DATE,'DD-MON-YY') AS ENTERED_DATE,
od.CUST_NUM,
NVL(sd.SAD_ALERT_FLAG,'N') AS SAD_ALERT_FLAG,
NVL(sd.SHIP_ALERT,'N') AS SHIP_ALERT,
sd.person_id,
ct.DELIVERY_NUMBER,
ct.CR_TRACK_NUM,
NVL(od.CANCELLED_QUANTITY,'0') AS CANCELLED_QUANTITY,
ct.CARRIER_NAME,
ct.WAYBILL,
ct.SHIP_METHOD_CODE
FROM ORDER_DETAIL od,
ALERTS sd,
C_TRACKING ct
WHERE od.ID = sd.ID(+)
AND od.ID = ct.ID(+)
AND od.CUST_NUM IN (10000)
AND OD.CUST_STATUS in ( 'BOOKED', 'SCHEDULED TO SHIP', 'CLOSED' , 'CANCELLED' , 'INVOICE_HOLD')
GROUP BY od.ID,
od.CUST_PO_NUM,
od.CUST_STATUS,
od.SHIP_DATE,
od.A_PART_NUM,
od.REQUIRED_DATE,
od.CUR_ACKED_DATE,
od.DOCK_DATE,
od.POD_DATE,
od.SHIP_TO,
od.UNIT_PRICE,
od.ITEM_TOTAL,
od.SHIP_FROM,
od.REQUIRED_DATE_LASTCHG_DT,
od.DOCK_DATE_LASTCHG_DT,
od.CUST_STATUS_LASTCHG_DT,
od.ROUTING_CODE,
od.ENTERED_DATE,
od.CUST_NUM,
NVL(sd.SAD_ALERT_FLAG,'N'),
NVL(sd.SHIP_ALERT,'N'),
sd.person_id,
ct.DELIVERY_NUMBER,
ct.CR_TRACK_NUM,
NVL(od.CANCELLED_QUANTITY,'0'),
ct.CARRIER_NAME,
ct.WAYBILL,
od.CUST_NUM,
ct.SHIP_METHOD_CODE
ORDER BY od.CUST_PO_NUM ASC
如果我调用上述查询query1
,那么我想要query1
返回的所有数据以及我想要从表order_detail
中获取所有数据,其中parent_line_number
是来自query1
的ID。
SELECT ID,
CUST_PO_NUM,
CUST_STATUS,
TO_CHAR(SHIP_DATE,'DD-MON-YY') AS SHIP_DATE,
A_PART_NUM,
TO_CHAR(REQUIRED_DATE,'DD-MON-YY') AS REQUIRED_DATE,
NULL,
TO_CHAR(CUR_ACKED_DATE,'DD-MON-YY') AS CUR_ACKED_DATE,
TO_CHAR(DOCK_DATE,'DD-MON-YY') AS DOCK_DATE,
TO_CHAR(POD_DATE,'DD-MON-YY') AS POD_DATE,
SHIP_TO,
UNIT_PRICE,
ITEM_TOTAL,
SHIP_FROM,
REQUIRED_DATE_LASTCHG_DT,
DOCK_DATE_LASTCHG_DT,
CUST_STATUS_LASTCHG_DT,
ROUTING_CODE,
TO_CHAR(ENTERED_DATE,'DD-MON-YY') AS ENTERED_DATE,
CUST_NUM,
NULL,
NULL,
Null,
NULL,
NULL,
NVL(CANCELLED_QUANTITY,'0') AS CANCELLED_QUANTITY,
NULL,
NULL,
NULL,
parent_line_number,
chip_set_flag,
NULL,
NULL,
Null,
NULL,
NULL,
WAREHOUSE
FROM ORDER_DETAIL where parent_line_number in (select Id from query1) ;
例如,如果我有以下数据:
id column1 cloumn2 ..... parent_line_number
1 abc anj null
2 fff eee null
3 bbb www 1
4 abh nnn 1
5 amm ff 2
6 aaa ss 3
7 sss fff null
然后如果我的query1
返回ID 1和7,那么我的最终结果将是:
id column1 cloumn2 ..... parent_line_number
1 abc anj null
3 bbb www 1
4 abh nnn 1
7 sss fff null
如果我们能够以这样的方式排序,即它显示第一个ID后跟其子数据,然后是第二个ID及其子数据等,那就太棒了。
答案 0 :(得分:3)
尝试使用WITH
子句的方法:
WITH first_query AS(
SELECT .... first query goes here
...
...
)
SELECT ........
.... second query goes here ....
.....
WHERE parent_line_number in (select Id from first_query)
UNION ALL
SELECT * FROM first_query
答案 1 :(得分:0)
扩展Kordiko的回答,使用简化的示例数据:
with query1 as (
select id, column1, column2, parent_line_number
from order_detail
where id in (1, 7)
)
select id, column1, column2, parent_line_number
from query1
union all
select o.id, o.column1, o.column2, o.parent_line_number
from query1 q1
join order_detail o on o.parent_line_number = q1.id;
ID COL COL PARENT_LINE_NUMBER
---------- --- --- ---------------------------------------
1 abc anj
7 sss fff
3 bbb www 1
4 abh nnn 1
如果您想按照描述的方式进行排序,可以将它放在带有虚拟列的子查询(或其他CTE)中,以保存您想要排序的值 - ID或父ID,以及行是否为行的标志是父母或孩子 - 并将它们用于订购:
with query1 as (
select id, column1, column2, parent_line_number
from order_detail
where id in (1, 7)
)
select id, column1, column2, parent_line_number
from (
select id, column1, column2, parent_line_number, id as ord1, 0 as ord2
from query1
union all
select o.id, o.column1, o.column2, o.parent_line_number, q1.id as ord1, 1 as ord2
from query1 q1
join order_detail o on o.parent_line_number = q1.id
)
order by ord1, ord2, id;
ID COL COL PARENT_LINE_NUMBER
---------- --- --- ---------------------------------------
1 abc anj
3 bbb www 1
4 abh nnn 1
7 sss fff