环境 :SQL2000问题描述:
(此问题描述的意思为找车辆经过某个区间的进入和驶出记录)
假设一辆车从A地区到B地区,进入A地区记录一次,在从A地区进入B地区的时候则再记录一次,如果设定A地区到B地区为一个区间,则此时在进入B地区的时候还要记录进入B地区的这辆从A地区来。则为编号 车 经过地区 上次进入
1 车辆1 A地区 0(表示没有)
2 车辆1 B地区 1 (记录编号1,表示上次从A地区经过)
3 车辆1 E地区 0 (表示没有)
4 车辆3 A地区 0 (表示没有)
5 车辆4 C地区 0 (表示没有)
6 车辆3 B地区 4 (记录编号4,表示上次从A地区经过)
7 车辆5 C地区 0 (表示没有)问题:
想要实现查询出来的效果:1.没有被关联上次进入的信息不显示
例:编号3、5、7 2.被关联的数据需显示在一起。
例:若 编号4的信息被编号6所关联,则两条信息显示为
4 车辆3 A地区 0 (表示没有)
6 车辆3 B地区 4 (记录编号4,表示上次从A地区经过)最终实现显示效果:
1 车辆1 A地区 0(表示没有)
2 车辆1 B地区 1 (记录编号1,表示上次从A地区经过)
4 车辆3 A地区 0 (表示没有)
6 车辆3 B地区 4 (记录编号4,表示上次从A地区经过)在线求解.
(此问题描述的意思为找车辆经过某个区间的进入和驶出记录)
假设一辆车从A地区到B地区,进入A地区记录一次,在从A地区进入B地区的时候则再记录一次,如果设定A地区到B地区为一个区间,则此时在进入B地区的时候还要记录进入B地区的这辆从A地区来。则为编号 车 经过地区 上次进入
1 车辆1 A地区 0(表示没有)
2 车辆1 B地区 1 (记录编号1,表示上次从A地区经过)
3 车辆1 E地区 0 (表示没有)
4 车辆3 A地区 0 (表示没有)
5 车辆4 C地区 0 (表示没有)
6 车辆3 B地区 4 (记录编号4,表示上次从A地区经过)
7 车辆5 C地区 0 (表示没有)问题:
想要实现查询出来的效果:1.没有被关联上次进入的信息不显示
例:编号3、5、7 2.被关联的数据需显示在一起。
例:若 编号4的信息被编号6所关联,则两条信息显示为
4 车辆3 A地区 0 (表示没有)
6 车辆3 B地区 4 (记录编号4,表示上次从A地区经过)最终实现显示效果:
1 车辆1 A地区 0(表示没有)
2 车辆1 B地区 1 (记录编号1,表示上次从A地区经过)
4 车辆3 A地区 0 (表示没有)
6 车辆3 B地区 4 (记录编号4,表示上次从A地区经过)在线求解.
2 车辆1 B地区 1 (记录编号1,表示上次从A地区经过)
3 车辆1 E地区 0 (表示没有)
记录编号1,表示上次从A地区经过
---
为什么不能是从E地区经过
god....
老兄,我是只打个比喻,你不能这样取巧吧
怎么可能一个区间呢
还有可能交叉区间,其它多个区间等等这个问题的切入点应该是
ID 与 上次进入ID
通过这两个去做查询,算我多余引申的那么复杂...这样的结构
ID upper_ID
1 0
2 0
3 0
4 3
5 2显示为:
ID upper_ID
3 0
4 3
2 0
5 2
from 表 A
left outer join 表 B
on A.编号 = B.上次进入
where B.上次进入 is null and A.上次进入 = 0select AA.* from 表 AA
where AA.编号 not in
(select A.编号
from 表 A
left outer join 表 B
on A.编号 = B.上次进入
where B.上次进入 is null and A.上次进入 = 0) A
--> 测试数据:#
if object_id('tempdb.dbo.#') is not null drop table #
create table #(ID int, upper_ID int)
insert into #
select 1, 0 union all
select 2, 0 union all
select 3, 0 union all
select 4, 3 union all
select 5, 2;with cte as
(
select * from # where upper_ID<>0
union all
select a.* from # a join cte b on a.ID=b.upper_ID
)
select * from cte --> 结果顺序略有不同, 需要什么顺序自己排/*
ID upper_ID
3 0
4 3
2 0
5 2
*/
if object_id('tempdb.dbo.#') is not null drop table #
create table #(ID int, upper_ID int)
insert into #
select 1, 0 union all
select 2, 0 union all
select 3, 0 union all
select 4, 3 union all
select 5, 2;with cte as
(
select *, sort=ID from # where upper_ID<>0
union all
select a.*, b.sort from # a join cte b on a.ID=b.upper_ID
)
select * from cte order by sort, upper_ID --已加入排序/*
ID upper_ID
3 0
4 3
2 0
5 2
*/