查询联合与另一个查询基于第一个

时间:2016-05-17 13:31:13

标签: sql oracle

我想要一个带有连接的查询和另一个使用第一个查询的输出作为输入的查询的联合。

我尝试创建一个存储过程并循环遍历游标并在临时表中逐个插入数据,但速度非常慢。如果您想查看该程序,请告诉我。

我的第一个问题是:

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及其子数据等,那就太棒了。

2 个答案:

答案 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