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

-一个大坑 2017-10-31 09:15:16
用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
...全文
701 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
-一个大坑 2017-11-01
  • 打赏
  • 举报
回复
引用 7 楼 qq646748739 的回复:
四个union并在一起? 这样性能岂不是很差?看下是否能再优化。
不知道怎么优化。查起来估计得5秒吧,还是新上线的系统数据少
碧水幽幽泉 2017-11-01
  • 打赏
  • 举报
回复
四个union并在一起? 这样性能岂不是很差?看下是否能再优化。
-一个大坑 2017-11-01
  • 打赏
  • 举报
回复
引用 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拼起来是三百多条,用你的这个查的五百多条 [/quote] 多出来的数据,是不是重复数据? 如果是的话,1. 要么把unionn all改成union ,2,要么在最外层的select后面加上distinct去重。[/quote] 不是,链接条件不一样导致的。我已经改成四个union并在一起了。写了300多行
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
引用 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拼起来是三百多条,用你的这个查的五百多条

[/quote]
你弄些insert into语句出来吧,我在电脑上测试下。
表结构也要发出来。
-一个大坑 2017-10-31
  • 打赏
  • 举报
回复
引用 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拼起来是三百多条,用你的这个查的五百多条

碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
试试这个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
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
可以优化,我写个SQL给你。
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
引用 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拼起来是三百多条,用你的这个查的五百多条

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

17,381

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧