使用临时表解决union和order by不能同时使用的问题
最近遇见了这样一个问题,有4张表,A(单据)表,B(产品)表,C(产品类型),D(单据产品关联表)。
B表有唯一对应的类型C(B join C on C.ID = B.CID)
A表通过两种方式和B表关联(必定只使用其中一种方式关联)。
一是A中存了一个B.ID作为外键关联B(A join B on B.ID = A.BID),
二是通过关联中间表D,再去关联B(A join D on D.AID = A.ID join B on B.ID = D.BID)。
现在需要查询符合一定条件全部N类型产品(C.NAME = N)的单据信息。结果根据单据A.startLifecycle(生成时间)排序;
看到需求第一时间想到的是UNION连接查询结果。
于是:
SELECT a.id, a.startLifecycle FROM A a
JOIN D d ON d.aid = a.id
JOIN B b ON b.id = d.bid
JOIN C c ON c.id = b.cid
WHERE c.name = 'N' AND ...
ORDER BY a.startLifecycle, a.id
UNION
SELECT a.id, a.startLifecycle FROM A a
JOIN B b ON b.id = a.bid
JOIN C c ON c.id = b.cid
WHERE c.name = 'N' AND ...
ORDER BY a.startLifecycle, a.id
好吧!出问题了,上网查了下,是UNION和ORDER BY一起使用引起的。
然后尝试了下其他方法(略),最后解决方案如下。
--A的过滤条件很多,先过滤A
WITH
t1 AS(SELECT a.id, a.startLifecycle FROM A a WHERE ...),
t2 AS(SELECT t1.id, t1.startLifecycle FROM t1JOIN D d ON d.aid = t1.id JOIN B b ON b.id = d.bidJOIN C c ON c.id = b.cidWHERE c.name = 'N'ORDER BY t1.startLifecycle, t1.id
),
t3 AS(SELECT t1.id, t1.startLifecycle FROM t1JOIN B b ON b.id = t1.bidJOIN C c ON c.id = b.cidWHERE c.name = 'N'ORDER BY t1.startLifecycle, t1.id
)
SELECT id, startLifecycle FROM t2
UNION
SELECT id, startLifecycle FROM t3;
使用临时表解决union和order by不能同时使用的问题相关推荐
- mysql union order_MySQL中union和order by同时使用的实现方法
MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...
- oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表-Oracle...
解决ORA-14450:试图访问已经在使用的事务处理临时表 解决方法 –1.查找sessionID select SID,SERIAL# from V$session where SID in (s ...
- SQL注入:3、无权读取information_schema库和拒绝union、order by语句
3.无权读取information_schema库和拒绝union.order by语句 information_schema: 3. information_schema: 想要查询这张表,必须是r ...
- mybatis多字段排序_解决mybatis中order by排序无效问题
1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111&qu ...
- 合作开发收费系统——临时表解决用户重复登录问题
用户重复登录问题,是指同一个用户能够用自己的账户和密码能够同时多次登录.这样的情况在实际使用中是不允许的,就跟QQ.飞信一样,如果你已经登录,等到再次登录的时候,系统就会提醒你" ...
- union与order by 结合使用
项目开发中遇到需要组合查询两张表返回分页列表,并需要采用创建时间排序,踩到一个小坑记录一下. 1.错误使用方法: 注:给两个子查询分别添加括号后sql不会报错,但是order by 没有效果,或者说没 ...
- Oracle 临时表解决ORA-22992问题
通过Database Link集成远程数据库时,从远程数据库上查询Blob字段时总返回ORA- 22992 错误 .有人采用物化视图解决这个问题,但物化视图同步机制会带来麻烦,如果同步时间设置过短,则 ...
- oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表...
在开发使用过程中,一个存储过程用到表TMP_DA_GMS,允许程序的时候报错,后台查询到错误原因是因为表里有个字段需要设置为可以为N 在开发使用过程中,一个存储过程用到表TMP_DA_GMS,允许程序 ...
- MySQL错误:ERROR 1221 (HY000): Incorrect usage of UNION and ORDER BY
MySQL版本:Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) 使用union将两个子查询纵向合并后插入到数据表出现了上面的错误,sql ...
最新文章
- Hinge Loss
- 图像金字塔(pyramid)与 SIFT 图像特征提取(feature extractor)
- 互联网分布式架构--演进过程
- 生日小助手的问答帮助——随时更新,长期有效……
- linux定时监控端口并重新启动shell脚本命令
- 利用第三方浏览器漏洞钓鱼
- VS code解决Latex不显示参考文献,正文中显示[?]的问题
- moco在接口自动化中的应用
- 和好几天又开战!AMD显卡老大跳槽,要帮英特尔进军GPU
- Code First 下自动更新数据库结构(Automatic Migrations)
- 第8章 数据库实例与操作模式
- mysql引擎 实际应用_MySQL数据库中的三个引擎
- kali解压deb_Kali下安装网易云音乐
- 美团财报数据初步分析
- 哈佛邓云天:Cascaded Text Generation with Markov Transformers
- 前端应届生面试技巧,没有项目经验怎么应对?
- Java导出Excel和Word
- kindle忘记密码怎么办_如果您的Kindle丢失或被盗怎么办
- 阿喀琉斯之踵的含义是什么?
- java编译release版本断言_关于Debug和Release之本质区别
热门文章
- java流的传递方式是_如何在方法中流式传输Java List(Varargs)的值?
- oracle在线sql数据库设计,一款在线ER模型设计工具,支持MySQL、SQLServer、Oracle、Postgresql...
- 三星s8怎么分屏操作_三星手机该怎么玩?了解完这几点用机技巧,可以轻车熟路了!...
- C++给函数传数组参数C++给函数传数组参数
- halcon/c++接口基础 之 析构函数和Halcon算子
- 生成0到1之间随机数的C代码
- c语言生命游戏代码大全,c++生命游戏源码
- 虚拟串口服务器zenetmanager,Avocent服务器/串口管理 KVM
- python之33个关键字详解_Python解析、提取url关键字的实例详解
- openstack一键安装脚本(转载)