最近遇见了这样一个问题,有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不能同时使用的问题相关推荐

  1. mysql union order_MySQL中union和order by同时使用的实现方法

    MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...

  2. oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表-Oracle...

    解决ORA-14450:试图访问已经在使用的事务处理临时表 解决方法 –1.查找sessionID select SID,SERIAL# from V$session  where SID in (s ...

  3. SQL注入:3、无权读取information_schema库和拒绝union、order by语句

    3.无权读取information_schema库和拒绝union.order by语句 information_schema: 3. information_schema: 想要查询这张表,必须是r ...

  4. mybatis多字段排序_解决mybatis中order by排序无效问题

    1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111&qu ...

  5. 合作开发收费系统——临时表解决用户重复登录问题

         用户重复登录问题,是指同一个用户能够用自己的账户和密码能够同时多次登录.这样的情况在实际使用中是不允许的,就跟QQ.飞信一样,如果你已经登录,等到再次登录的时候,系统就会提醒你" ...

  6. union与order by 结合使用

    项目开发中遇到需要组合查询两张表返回分页列表,并需要采用创建时间排序,踩到一个小坑记录一下. 1.错误使用方法: 注:给两个子查询分别添加括号后sql不会报错,但是order by 没有效果,或者说没 ...

  7. Oracle 临时表解决ORA-22992问题

    通过Database Link集成远程数据库时,从远程数据库上查询Blob字段时总返回ORA- 22992 错误 .有人采用物化视图解决这个问题,但物化视图同步机制会带来麻烦,如果同步时间设置过短,则 ...

  8. oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表...

    在开发使用过程中,一个存储过程用到表TMP_DA_GMS,允许程序的时候报错,后台查询到错误原因是因为表里有个字段需要设置为可以为N 在开发使用过程中,一个存储过程用到表TMP_DA_GMS,允许程序 ...

  9. 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 ...

最新文章

  1. Hinge Loss
  2. 图像金字塔(pyramid)与 SIFT 图像特征提取(feature extractor)
  3. 互联网分布式架构--演进过程
  4. 生日小助手的问答帮助——随时更新,长期有效……
  5. linux定时监控端口并重新启动shell脚本命令
  6. 利用第三方浏览器漏洞钓鱼
  7. VS code解决Latex不显示参考文献,正文中显示[?]的问题
  8. moco在接口自动化中的应用
  9. 和好几天又开战!AMD显卡老大跳槽,要帮英特尔进军GPU
  10. Code First 下自动更新数据库结构(Automatic Migrations)
  11. 第8章 数据库实例与操作模式
  12. mysql引擎 实际应用_MySQL数据库中的三个引擎
  13. kali解压deb_Kali下安装网易云音乐
  14. 美团财报数据初步分析
  15. 哈佛邓云天:Cascaded Text Generation with Markov Transformers
  16. 前端应届生面试技巧,没有项目经验怎么应对?
  17. Java导出Excel和Word
  18. kindle忘记密码怎么办_如果您的Kindle丢失或被盗怎么办
  19. 阿喀琉斯之踵的含义是什么?
  20. java编译release版本断言_关于Debug和Release之本质区别

热门文章

  1. java流的传递方式是_如何在方法中流式传输Java List(Varargs)的值?
  2. oracle在线sql数据库设计,一款在线ER模型设计工具,支持MySQL、SQLServer、Oracle、Postgresql...
  3. 三星s8怎么分屏操作_三星手机该怎么玩?了解完这几点用机技巧,可以轻车熟路了!...
  4. C++给函数传数组参数C++给函数传数组参数
  5. halcon/c++接口基础 之 析构函数和Halcon算子
  6. 生成0到1之间随机数的C代码
  7. c语言生命游戏代码大全,c++生命游戏源码
  8. 虚拟串口服务器zenetmanager,Avocent服务器/串口管理 KVM
  9. python之33个关键字详解_Python解析、提取url关键字的实例详解
  10. openstack一键安装脚本(转载)