Sql 查询与基于第一个查询的另一个查询的并集

Sql 查询与基于第一个查询的另一个查询的并集,sql,oracle,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-

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

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

我的第一个问题是:

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\u detail
中获取所有数据,其中
parent\u line\u 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及其子数据,等等,那就太好了。

尝试使用
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

尝试使用
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

稍微扩展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                                        

稍微扩展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                                        


您使用的是哪个版本的Oracle?您确定在层次结构中只有一个级别-即父级和子级,但没有孙辈(或祖父母)?我使用的是11g。是的,不会有任何问题,您使用的是哪一版本的Oracle?您确定在层次结构中只有一个级别-即父级和子级,但没有孙辈(或祖父母)?我使用的是11g。是的,不会有孙子了。非常感谢,你让它看起来很简单:)有没有办法按照我上面描述的方式订购它们?非常感谢,你让它看起来很简单:)有没有办法按照我上面描述的方式订购它们?谢谢Alex。但这给了我两个问题。1:重复的数据,如果数据已经存在于连接的左侧和右侧。父行“”-数字显示的是id值,而不是原始值。有没有其他的方式来订购我的应用程序所需要的?很难说清楚你的意思。对于(1)您是否需要将查询1更改为添加
,并且父行编号为null
?对于(2),它已经显示了query1 ID,这是
父行\u编号
。。。这不是用于订购的。这显示了您想要的顺序,不是吗?这就是1ID PLN ORD2标志744 744 0 Y 747 744 747 1 N 748 744 748 1 N 745 745 0 Y 749 745 749 1 N 750 745 750 1 N 746 746 0 Y 751 756 751 N的情况752 746 752 1 N 747 744 747 0 N 748 744 748 0 N 749 745 749 0 N 750 745 750 0 N 751 746 751 0 N 752 746 752 0不知道你想让我做什么,它不完全可读。但请注意,我没有在最终选择列表中包括ord1和ord2,它们只是用于订购。您是否尝试添加父行为空的条件?谢谢Alex。但这给了我两个问题。1:重复的数据,如果数据已经存在于连接的左侧和右侧。父行“”-数字显示的是id值,而不是原始值。有没有其他的方式来订购我的应用程序所需要的?很难说清楚你的意思。对于(1)您是否需要将查询1更改为添加
,并且父行编号为null
?对于(2),它已经显示了query1 ID,这是
父行\u编号
。。。这不是用于订购的。这显示了您想要的顺序,不是吗?这就是1ID PLN ORD2标志744 744 0 Y 747 744 747 1 N 748 744 748 1 N 745 745 0 Y 749 745 749 1 N 750 745 750 1 N 746 746 0 Y 751 756 751 N的情况752 746 752 1 N 747 744 747 0 N 748 744 748 0 N 749 745 749 0 N 750 745 750 0 N 751 746 751 0 N 752 746 752 0不知道你想让我做什么,它不完全可读。但请注意,我没有在最终选择列表中包括ord1和ord2,它们只是用于订购。您是否尝试添加父行为null的条件?