两个sql只有一个查询条件不一样,用union就感觉很浪费?

时间:2022-04-18 15:14:04
用union可以并在一起。但是查询语句很长的,我没复制完整的过来,用union并在一起很长

select n.deriveno,
       n.appno,
       to_char(m.appdt, 'yyyy/mm/dd') appdt,
       m.passenger_qty,
       m.ride_starttime,
       m.ride_backtime,
       m.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       m.udate
  from app_main       m,
       app_nomapping  n,
       app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where m.appno = n.deriveno  --这句
   and m.appno = cd.appno
   and m.appemplid = e.emplid
   and m.aim_id = g.aim_id
   and m.appno = p.appno
   and m.appno = sc.appno


select n.deriveno,
       n.appno,
       to_char(m.appdt, 'yyyy/mm/dd') appdt,
       m.passenger_qty,
       m.ride_starttime,
       m.ride_backtime,
       m.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       m.udate
  from app_main       m,
       app_nomapping  n,
       app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where m.appno = n.appno  --这句
   and m.appno = cd.appno
   and m.appemplid = e.emplid
   and m.aim_id = g.aim_id
   and m.appno = p.appno
   and m.appno = sc.appno

8 个解决方案

#1


可以优化,我写个SQL给你。

#2


试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

#3


引用 2 楼 qq646748739 的回复:
试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

#4


引用 3 楼 happy4944 的回复:
Quote: 引用 2 楼 qq646748739 的回复:

试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

你弄些insert into语句出来吧,我在电脑上测试下。
表结构也要发出来。

#5


引用 3 楼 happy4944 的回复:
Quote: 引用 2 楼 qq646748739 的回复:

试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

多出来的数据,是不是重复数据?
如果是的话,1. 要么把unionn all改成union ,2,要么在最外层的select后面加上distinct去重。

#6


引用 5 楼 qq646748739 的回复:
Quote: 引用 3 楼 happy4944 的回复:

Quote: 引用 2 楼 qq646748739 的回复:

试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

多出来的数据,是不是重复数据?
如果是的话,1. 要么把unionn all改成union ,2,要么在最外层的select后面加上distinct去重。

不是,链接条件不一样导致的。我已经改成四个union并在一起了。写了300多行

#7


四个union并在一起? 这样性能岂不是很差?看下是否能再优化。

#8


引用 7 楼 qq646748739 的回复:
四个union并在一起? 这样性能岂不是很差?看下是否能再优化。

不知道怎么优化。查起来估计得5秒吧,还是新上线的系统数据少

#1


可以优化,我写个SQL给你。

#2


试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

#3


引用 2 楼 qq646748739 的回复:
试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

#4


引用 3 楼 happy4944 的回复:
Quote: 引用 2 楼 qq646748739 的回复:

试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

你弄些insert into语句出来吧,我在电脑上测试下。
表结构也要发出来。

#5


引用 3 楼 happy4944 的回复:
Quote: 引用 2 楼 qq646748739 的回复:

试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

多出来的数据,是不是重复数据?
如果是的话,1. 要么把unionn all改成union ,2,要么在最外层的select后面加上distinct去重。

#6


引用 5 楼 qq646748739 的回复:
Quote: 引用 3 楼 happy4944 的回复:

Quote: 引用 2 楼 qq646748739 的回复:

试试这个SQL
为了优化:内层子查询没有使用m.appno = n.deriveno or m.appno = n.appno,而是采用union all
   
select x.deriveno,
       x.appno,
       x.appdt,
       x.passenger_qty,
       x.ride_starttime,
       x.ride_backtime,
       x.appemplname,
       e.deptid,
       g.groupname,
       g.groupscope,      
       x.udate
  from(select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.deriveno
union all
   select n.deriveno,n.appno,m.passenger_qty,m.ride_starttime,
  m.ride_backtime,m.appemplname,m.udate,aim_id,
  m.appno as appno_m,m.appemplid,to_char(m.appdt, 'yyyy/mm/dd') appdt,
 from app_main m,app_nomapping n
where m.appno = n.appno
   )x,
   app_chargedept cd,
       employee       e,
       bd_groupandaim g,
       app_passenger  p,
       app_schedule   sc
 where x.appno_m = cd.appno
   and x.appemplid = e.emplid
   and x.aim_id = g.aim_id
   and x.appno_m = p.appno
   and x.appno_m = sc.appno    

数据有点问题,appno是原始单号,deriveno是拆单后的单号,应该是两条结果查的是4条。
我用自己写的拆单,原单,拼单分开查然后用union拼起来是三百多条,用你的这个查的五百多条
两个sql只有一个查询条件不一样,用union就感觉很浪费?

多出来的数据,是不是重复数据?
如果是的话,1. 要么把unionn all改成union ,2,要么在最外层的select后面加上distinct去重。

不是,链接条件不一样导致的。我已经改成四个union并在一起了。写了300多行

#7


四个union并在一起? 这样性能岂不是很差?看下是否能再优化。

#8


引用 7 楼 qq646748739 的回复:
四个union并在一起? 这样性能岂不是很差?看下是否能再优化。

不知道怎么优化。查起来估计得5秒吧,还是新上线的系统数据少