使用临时表解决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;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.3线性表的链式存储和运算—双向链表

以上讨论的单链表的结点中只有一个指向其后继结点的指针域next,因此若已知某结点的指针为p,其后继结点的指针则为p->next ,而找其前驱则只能从该链表的头指针开始,顺着各结点的next 域进行,也就是说找后继的时间性能…

通过栈(Stack)实现对树的遍历

说到数的遍历树,长期以来的第一印象都是通过递归去实现。然而今天看了某位前辈的代码,才发现使用栈去实现遍历是那么简单。理论上通过数组也是可以实现同等功能的,毕竟Stack也是通过数据去实现的。 package com.sysway.ui.widget;import jav…

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中,选择collection view controller中的"Collection View"。在Attributes inspector中,选择"Section Header"和"Section Footer",一旦选中你就会在屏幕中看到下面的的显示: 最重要的是&#xff0c…

树形结构数据汇总查询解决方案+优化求助

最近遇到一个地区数据汇总的问题,地区下的地址呈树形结构,(简化结构)如A市下有B、C区,B区下有D、E街道。先要查询所有地区的人数(包括子区域),如A的人数直属A的人数B的人数C的人数D的…

Dom4j 学习笔记

dom4j 是一种解析 XML 文档的开放源代码 XML 框架。dom4j下载地址 本文主要记载了一些简单的使用方法。 一、xml文件的解析 dom4j既可以解析普通的xml文件&#xff0c;也可以解析一个InputStream&#xff0c;先看看xml文件长什么样子&#xff1a; <books><book>&l…

交叉连接(CROSS JOIN)的实际应用

一次偶然的机会&#xff0c;使用到了万年不用的交叉连接&#xff08;CROSS JOIN&#xff09; 业务场景如下&#xff1a; 1、存在多个运营商&#xff0c;每个运营商下面都有各种类型的设备&#xff0c;不同运营商的设备不完全相同&#xff1b; 2、任何设备有且仅有两种用途‘…

C# xml文件读取与修改

c#读写xml文件已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外连接从表过滤

1、使用left join时从表的过滤 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

ORACLE将查询字段指定为某种类型

SELECT CAST(张三 AS VARCHAR2(20)) name FROM dual; 一般来说在查询时很少有用到这种语句&#xff0c;但是使用CREATE TABLE ... AS SELECT ...语句的时候这个就很好用了 --建表 CREATE TABLE test01 AS SELECT 张三 name FROM dual; --正常插入数据 INSERT INTO test01 SEL…

分组查询最晚一条数据(ORACLE)

现有客户表&#xff0c;交费表&#xff0c;需查询每个存在交费记录客户的最后一笔交费信息 这里提供两种方式 注&#xff1a;客户不会在同一时间有两条交费&#xff0c;SQL可直接执行 --查询客户名称&#xff0c;最后一笔交费时间&#xff0c;以及最后一笔交费金额 WITH --客…

ORACLE循环中使用序列

在批量生成数据时&#xff0c;经常会用到序列的Nextval&#xff0c;今天碰到了这样的情况&#xff0c;日常记录&#xff0c;下附解决方案。先看这段脚本 DECLARE i INTEGER; BEGINFOR cur IN 1..5 LOOPi : DomainObjectId.Nextval;dbms_output.put_line(i);END LOOP; END; 编…

mysql001创建数据库

-- 注释&#xff0c;ctrl/ -- 查询所有数据库&#xff1b; show DATABASES; -- 创建数据库; CREATE DATABASE studb; -- 切换数据库; USE studb; -- 删除数据库 DROP DATABASE studb;

mysql002创建表

-- 创建student表 DDL CREATE TABLE stdent( sno int(3), name VARCHAR(55), sex CHAR(2), age int, dtdate date, classname VARCHAR(55), email VARCHAR(55) ) -- 查询表中数据 DQL SELECT * FROM stdent;

mysql003操作表DDL

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 在表中添加一列 DDL -- 新增列 默认添加到最后 ALTER TABLE stdent add score DOUBLE(4,1); -- 新增一列 在表中开头添加 ALTER TABLE stdent add score2 double(5,1) first; -- 在指定列后面添…

mysql005约束.列级别

-- 列级约束 -- sno 主键&#xff1a;唯一&#xff0c;不为空&#xff0c;自增 -- name 非空 -- sex 非空&#xff0c;默认值&#xff0c;只有男女 -- age 0-30岁 -- score 非空 -- dtdate 非空 -- classname 非空 -- email唯一 -- 创建表&#xff0c;增加列级约束 …

hdu.1430.魔板(bfs + 康托展开)

魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170 Accepted Submission(s): 455 Problem Description在魔方风靡全球之后不久&#xff0c;Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方…

mysql006添加外键约束

-- 添加外键 -- 建立主表&#xff0c;班级表 CREATE TABLE class( cno int PRIMARY key auto_increment, cname VARCHAR(55) ) SELECT * FROM class; -- 建立从表&#xff0c;学生表 CREATE table stu( sno int PRIMARY KEY auto_increment, sname VARCHAR(55), sex ch…

Circle-Progress-View

https://github.com/jakob-grabner/Circle-Progress-View 转载于:https://www.cnblogs.com/eustoma/p/4507476.html

elasticsearch 删除满足条件的语句_ELK从入门到还未精通(二)——ElasticSearch上篇

大家好&#xff0c;我是泥腿子安尼特&#xff0c;5个月没在李佬都公众号更新文章了。上一篇&#xff0c;大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的。今天就讲讲这个最重要的E——基于Lucene的搜索引擎ElasticSearch(后面简称ES)。最近刚搬家&#xff0c;没想到隔…

mysql004操作表.增删改

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 新增数据 这种写法数据的循序和数据库的字段循序保持一致。 INSERT INTO stdent values (1,"张三","男",25,"2021.1.1","java","123qq.com"); --…