如何实现以下的数据查找??

freetd 2011-06-07 03:37:44
现有一表,数据如下:
源表[T]
col1   col2   ID col3   col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c B 3 400-3 BF
d NULL 4 400-1 NULL
e B 5 400-2 BH
f B 6 400-3 NULL
g CN 7 400-1 NULL
g EN 8 400-1 NULL
f NULL 9 400-3 NULL
x CN 10 400-1 NULL
s EN 11 400-1 NULL
h NULL 12 400-3 NULL
b CN 13 400-5 NULL
f EN 14 400-6 NULL
x CN 15 400-1 NULL
s EN 16 400-1 NULL
b NULL 17 400-3 NULL
v A 18 400-3 BF
在这张表中找出列col4中为BH的行,接着在找出的记录中分两种情况进行进一步的查找。
注意:ID列是已经按从小到大排序,且是唯一的

--第一种情况是col4列的值是BH且col2列的值是如下
col1   col2   ID col3   col4
a A 1 400-1 BH
--第一种情况查找过程:根据上一记录中col3列的值400-1在往后列col3所有都为400-1的记录,筛选出col2列中最先出现CNEN的记录。
d NULL 4 400-1 NULL
g CN 7 400-1 NULL
g EN 8 400-1 NULL
x CN 10 400-1 NULL
s EN 11 400-1 NULL
x CN 15 400-1 NULL
s EN 16 400-1 NULL
--第一种情况的最终结果
col1 col2 ID col3 col4
a A 1 400-1 BH
g CN 7 400-1 NULL

--第二种情况稍微有些不同,col4列的值是BH且col2的值是,如下:
col1   col2   ID col3   col4
e B 5 400-2 BH
--第二种情况查找过程:这里查找的是与400-2相同的记录,而是比400-2要大的所有记录并从中筛选出col2列中最先出现CNEN的记录。
f B 6 400-3 NULL
f NULL 9 400-3 NULL
b CN 13 400-5 NULL
f EN 14 400-6 NULL
b NULL 17 400-3 NULL
v A 18 400-3 BF
--第二种情况的最终结果
col1 col2 ID col3 col4
e B 5 400-2 BH
b CN 13 400-5 NULL

--最后的结果就是两种情况的结果联合起来
col1 col2 ID col3 col4
a A 1 400-1 BH
g CN 7 400-1 NULL
e B 5 400-2 BH
b CN 13 400-5 NULL
...全文
131 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2011-06-11
  • 打赏
  • 举报
回复
恭喜楼主,
推论: 楼主SQL Server至少是SQL 2005.
freetd 2011-06-10
  • 打赏
  • 举报
回复
我自己实现了,代码如下:

;WITH T AS
(
SELECT ROW_NUMBER() OVER(ORDER BY GETDATE()) AS Rid,* FROM dbo.ss WHERE col4='BH' and col2='A'
),TS AS(
SELECT (Rid*2-1)AS 'Aid',a.*,'start' AS [single],Rid*2 AS 'Cid',c.col1 AS c1, c.col2 AS c2, c.ID AS i2, c.col3 AS c3, c.col4 AS c4,[singlec] FROM T a
OUTER APPLY(
SELECT TOP 1 *,'end' AS [singlec]FROM dbo.ss b WHERE b.col3 = a.col3 AND b.ID>a.ID AND b.col2 in ('CN','EN')
) c
)
SELECT aid,col1,col2,id,col3,col4,[single] FROM TS --WHERE Aid % 2 <> 0
UNION ALL
SELECT cid ,c1,c2,i2,c3,c4,[singlec] FROM TS --WHERE c1 IS NOT NULL
ORDER BY 1

这里只是第一种情况,第二种情况类似
freetd 2011-06-08
  • 打赏
  • 举报
回复
有没有办法实现一条BH开始一条EN或CN结束的记录这样排序(当然如果结束的找不到就为空记录),如下数据所示:

col1 col2 ID col3 col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c A 3 400-1 BH
d NULL 4 400-1 NULL
e EN 5 400-1 BF
f B 6 400-3 NULL
g CN 7 400-1 NULL
g A 8 400-6 BH
f NULL 9 400-3 NULL

--第一对记录
a A 1 400-1 BH
e EN 5 400-1 BF
--第二对记录
c A 3 400-1 BH
e EN 5 400-1 BF
--第三对记录
g A 8 400-6 BH

--合起来就是结果,顺序就是上面所讲的一条记录开始一条记录结束:
a A 1 400-1 BH
e EN 5 400-1 BF
c A 3 400-1 BH
e EN 5 400-1 BF
g A 8 400-6 BH

--当然这只是第一种结果的排序,第二种结果的排序也是一样,一条开始一条结束,找不到就结束
freetd 2011-06-08
  • 打赏
  • 举报
回复
有没有办法实现一条BH开始一条EN或CN结束的记录这样排序(当然如果结束的找不到就为空记录),如下数据所示:

col1 col2 ID col3 col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c A 3 400-1 BH
d NULL 4 400-1 NULL
e EN 5 400-1 BF
f B 6 400-3 NULL
g CN 7 400-1 NULL
g A 8 400-6 BH
f NULL 9 400-3 NULL

--第一对记录
a A 1 400-1 BH
e EN 5 400-1 BF
--第二对记录
c A 3 400-1 BH
e EN 5 400-1 BF
--第三对记录
g A 8 400-6 BH

--合起来就是结果,顺序就是上面所讲的一条记录开始一条记录结束:
a A 1 400-1 BH
e EN 5 400-1 BF
c A 3 400-1 BH
e EN 5 400-1 BF
g A 8 400-6 BH
唐诗三百首 2011-06-07
  • 打赏
  • 举报
回复
不好意思,刚才看错了,正确SQL如下,

create table T
(col1 varchar(1),
col2 varchar(2),
ID int,
col3 varchar(10),
col4 varchar(2))

insert into T
select 'a','A','1','400-1','BH' union all
select 'b',NULL,'2','400-2',NULL union all
select 'c','B','3','400-3','BF' union all
select 'd',NULL,'4','400-1',NULL union all
select 'e','B','5','400-2','BH' union all
select 'f','B','6','400-3',NULL union all
select 'g','CN','7','400-1',NULL union all
select 'g','EN','8','400-1',NULL union all
select 'f',NULL,'9','400-3',NULL union all
select 'x','CN','10','400-1',NULL union all
select 's','EN','11','400-1',NULL union all
select 'h',NULL,'12','400-3',NULL union all
select 'b','CN','13','400-5',NULL union all
select 'f','EN','14','400-6',NULL union all
select 'x','CN','15','400-1',NULL union all
select 's','EN','16','400-1',NULL union all
select 'b',NULL,'17','400-3',NULL union all
select 'v','A','18','400-3','BF'

select * from T where col4='BH' and col2='A'
union all
select top 1 * from T where col3 in (select col3 from T where col4='BH' and col2='A') and col2 in ('CN','EN')
union all
select * from T where col4='BH' and col2='B'
union all
select top 1 * from T where col3 > (select col3 from T where col4='BH' and col2='B') and col2 in ('CN','EN')

-- LZ要的结果.
col1 col2 ID col3 col4
---- ---- ----------- ---------- ----
a A 1 400-1 BH
g CN 7 400-1 NULL
e B 5 400-2 BH
b CN 13 400-5 NULL
freetd 2011-06-07
  • 打赏
  • 举报
回复
字面上是那么理解的,可是执行的时候就说
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "c1.col3"。
freetd 2011-06-07
  • 打赏
  • 举报
回复
而且也不能执行
唐诗三百首 2011-06-07
  • 打赏
  • 举报
回复
... 开头的with c1 as () 就是定义c1表.
freetd 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ap0405140 的回复:]

楼主的问题是递归查询,SQL2005起可使用with语句.
SQL code

with c1 as
(
select * from T where col4='BH' and col2='A'
union all
select top 1 * from T where T.col3=c1.col3 and col2 in ('CN','EN')
)
select * from c1


……
[/Quote]
你这个语句有问题,c1.col3是指那个表的?
唐诗三百首 2011-06-07
  • 打赏
  • 举报
回复
楼主的问题是递归查询,SQL2005起可使用with语句.

with c1 as
(
select * from T where col4='BH' and col2='A'
union all
select top 1 * from T where T.col3=c1.col3 and col2 in ('CN','EN')
)
select * from c1

freetd 2011-06-07
  • 打赏
  • 举报
回复
如何用SQL显现以上的查找结果??
freetd 2011-06-07
  • 打赏
  • 举报
回复
排版怎么变得这么乱,再发一次

--现有一表,数据如下
--源表[T]
col1 col2 ID col3 col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c B 3 400-3 BF
d NULL 4 400-1 NULL
e B 5 400-2 BH
f B 6 400-3 NULL
g CN 7 400-1 NULL
g EN 8 400-1 NULL
f NULL 9 400-3 NULL
x CN 10 400-1 NULL
s EN 11 400-1 NULL
h NULL 12 400-3 NULL
b CN 13 400-5 NULL
f EN 14 400-6 NULL
x CN 15 400-1 NULL
s EN 16 400-1 NULL
b NULL 17 400-3 NULL
v A 18 400-3 BF

--在这张表中找出列col4中为BH的行,接着在找出的记录中分两种情况进行进一步的查找。
--注意:ID列是已经按从小到大排序,且是唯一的

--第一种情况是col4列的值是BH且col2列的值是A如下
col1 col2 ID col3 col4
a A 1 400-1 BH
--第一种情况查找过程:根据上一记录中col3列的值400-1在往后列col3所有都为400-1的记录,筛选出col2列中最先出现CN或EN的记录。
d NULL 4 400-1 NULL
g CN 7 400-1 NULL
g EN 8 400-1 NULL
x CN 10 400-1 NULL
s EN 11 400-1 NULL
x CN 15 400-1 NULL
s EN 16 400-1 NULL
--第一种情况的最终结果
col1 col2 ID col3 col4
a A 1 400-1 BH
g CN 7 400-1 NULL

--第二种情况稍微有些不同,col4列的值是BH且col2的值是B,如下:
col1 col2 ID col3 col4
e B 5 400-2 BH
--第二种情况查找过程:这里查找的是与400-2相同的记录,而是比400-2要大的所有记录并从中筛选出col2列中最先出现CN或EN的记录。
f B 6 400-3 NULL
f NULL 9 400-3 NULL
b CN 13 400-5 NULL
f EN 14 400-6 NULL
b NULL 17 400-3 NULL
v A 18 400-3 BF
--第二种情况的最终结果
col1 col2 ID col3 col4
e B 5 400-2 BH
b CN 13 400-5 NULL

--实际的结果就是两种情况的结果联合起来
col1 col2 ID col3 col4
a A 1 400-1 BH
g CN 7 400-1 NULL
e B 5 400-2 BH
b CN 13 400-5 NULL

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧