求解SQL数据库两张表数据的排序问题

有两张表。一张是部门表(d_dept),格式如下
Dept_ID Dept_Name
001 A部门
002 B部门
003 C部门
一张是单位表(d_unit),格式如下:
unit_ID unit_Name
001001 AA单位
001002 AB单位
003001 CC单位
问题:要求数据展现格式如下,并按照部门和单位编码排序:
001 A部门
001001 AA单位
001002 AB单位
002 B部门
....
请大侠们务必附带文字解释说明,在下感激不尽。

select ID=Dept_ID,Name=Dept_Name
from (
select *,flag=0 from d_dept
union all
select *,1 from d_unit) k
order by left(Dept_ID,3) asc,flag asc,Dept_ID asc

首先通过
select *,flag=0 from d_dept
union all
select *,1 from d_unit
将所有内容合并在一起 这样合一起是乱序的

然后将它作为临时表
from (
select *,flag=0 from d_dept
union all
select *,1 from d_unit) k
注意这里我加个了个FLAG字段 是为了标志0为部门 1为单位 为之后排序做准备

然后利用这个临时表 我进行排序 看下面
select ID=Dept_ID,Name=Dept_Name
这句的意思 理解的吧 选取临时结果集的2个字段,注意这里的Dept_ID和Dept_Name分别语句包含了unit_ID 和unit_Name(这个自己执行下临时结果集就知道了)

我们重点来说排序
order by left(Dept_ID,3) asc,flag asc,Dept_ID asc
先看第一个left(Dept_ID,3) 首先要进行部门排序的 我们是以左边三个符号位排序信息的 排出来就是
001
001001
..
002
..
003
003...

上面的排序不保证每个部门里面的排序时按照部门号先 然后再改部门的单位的顺序 所以加上flag asc
在每组里面 要让部门号先 通过FLAG=0 将部门号放在了前面
所以这里出来:

001
001001
..
002
..
003
003...

请看 在001号部门里面 001 肯定在 001XXX前面了

但是这排序不能保证 001XXX 001XXY这样的单位号排序 就是加上
Dept_ID asc 明白了吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-18
select dept_id as id,dept_name as name from d_dept
union all select unit_ID as id,unit_Name as name from d_unit
ORDER BY id ASC

因为两个表的ID都是字符类型的,所以排序都是按字典序排序的.这样自然就达到你的目的了.如果是数字类型的,这样排就不行.

字典序,先从第一个字符比较,比如30和100比较的话,就先比3和1,这样得到结果就是100在30前面
第2个回答  2010-07-18
貌似条件不全,单位表还差个列“dept_id”。现在只有直接把两个表用union 连接起来,直接并起来,按id排序就好了。你送分啊。。。
select a.dept_id,a.Dept_Name,'部门表' as bz from d_dept as a--第一个表
union all
select b.unit_ID,b.unit_Name,'单位表' as bz from d_unit as b--第二个表,如果有更多的可以继续用union all连起来。
order by dept_id--排序,字段名认第一个查询的字段名,第二个查询和第一个查询的列数、字段类型一致。
相似回答