常见SQL问题,急请大大们帮忙!

Leedye 2012-02-11 04:44:29
各位新年好!请帮忙看看:
有视图V,含如下记录(为清晰起见,故分为5组):

Aid Aname AE AR
1 AN1 ae1 ar10
1 AN1 ae1 ar12
1 AN1 ae1 ar13
1 AN1 ae1 ar14

2 AN2 ae2 ar20
2 AN2 ae2 ar21
2 AN2 ae2 ar22
2 AN2 ae2 NULL

2 AN2 ae3 NULL
2 AN2 ae3 NULL
2 AN2 ae3 ar23
2 AN2 ae3 ar24

2 AN2 ae4 ar25
2 AN2 ae4 ar26
2 AN2 ae4 NULL
2 AN2 ae4 ar27

2 AN2 ae5 NULL
2 AN2 ae5 NULL
2 AN2 ae5 NULL
2 AN2 ae5 NULL

想要查询结果(需要写的SQL:只返回不同Aid的第一行数据即可,具体要求请见下面说明):

Aid Aname AE AR
1 AN1 ae1 ar10
2 AN2 ae2 ar20

说明:视图V是已经创建的中间数据,AE和AR字段(在实际中均对应多列,现把它们各抽象为一组列),一个AE对应4个AR, 同一个Aid最多有4个AE (最少1个),则AR最多有(4x4)16个(最少4个) ,实际业务中动态查询的情况:
1. 当AE的个数等于1时,则对应的(4个) 任意一个AR值都有可能为空.(为空的用0代替);
2. 当AE的个数大于1时,则对应的每组中的任意一个AR值都有可能为空.(为空的用0代替)


备注: 1.每组AE之间应该用AND连接吧(因为对应的实际业务数据都为同一个Aid的属性)
2. AE与本组的AR之间也应该用AND连接吧( 原因同上)
3. AE和AR是在程序中要输入查询的参数(即可输入4个AE值,16个AR值进行查询).






...全文
123 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leedye 2012-02-12
  • 打赏
  • 举报
回复
AcHerat:抱歉,看错了,Beirut给了两次,应该是一次给您的.
Leedye 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 beirut 的回复:]

引用 7 楼 leedye 的回复:

回6楼:绕来绕去 你这也就是随便取出来一条就行 是这个意思吗
RE:嗯,可以是符合条件的任意一条(因为在实际中AR和AE各代表的是几个字段,它们之间貌似是无法去比较的)


那我3楼写的应该就可以

1楼的也没啥问题
[/Quote]

如果只是返回结果,不去和字段匹配查询的话,应该说就非常简单了,但是...
郁闷中...

黄_瓜 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leedye 的回复:]

回6楼:绕来绕去 你这也就是随便取出来一条就行 是这个意思吗
RE:嗯,可以是符合条件的任意一条(因为在实际中AR和AE各代表的是几个字段,它们之间貌似是无法去比较的)
[/Quote]

那我3楼写的应该就可以

1楼的也没啥问题
Leedye 2012-02-11
  • 打赏
  • 举报
回复
ae < t.ae (ae代表ae1,ae2...所以实际中恐怕无法这样来比较哦)
DaWuGui大大新年好哦!不知晴天大大在线否?(如果这个需求确实描述得不易理解的话,我貌似只有改下了,555...)
dawugui 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dawugui 的回复:]
select t.* from tb t where ar is not null and not exists (select 1 from tb where ar is not null and aid = t.aid and aname = t.aname and (ae < t.ae or (ae = t.ar and ar < t.ar)))
[/Quote]

select t.* from tb t where ar is not null and not exists (select 1 from tb where ar is not null and aid = t.aid and aname = t.aname and (ae < t.ae or (ae = t.ae and ar < t.ar)))
Leedye 2012-02-11
  • 打赏
  • 举报
回复
如果AR和AE是单个字段,我想对大家来说都是小菜一碟,不过实际情况是:AE(是同一组条件的多个字段,如代表AE1,AE2...)AR也是如此,如果AE和AR(或自身)去比较的话,实际中是无法做到的,假如大家觉得费解的话,我看来要改为更实际更容易理解的了?
dawugui 2012-02-11
  • 打赏
  • 举报
回复
select t.* from tb t where ar is not null and not exists (select 1 from tb where ar is not null and aid = t.aid and aname = t.aname and (ae < t.ae or (ae = t.ar and ar < t.ar)))
Leedye 2012-02-11
  • 打赏
  • 举报
回复
回6楼:绕来绕去 你这也就是随便取出来一条就行 是这个意思吗
RE:嗯,可以是符合条件的任意一条(因为在实际中AR和AE各代表的是几个字段,它们之间貌似是无法去比较的)
黄_瓜 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leedye 的回复:]

谢谢大家的回复: 回1楼:不只是返回结果哦,您的SQL无法去和实际的字段去匹配查询哦;
回4楼:可以Aid为排序,且在实际中每组AE中的每个AR值都允许相同,不同AE组的AR值也允许相同(虽然极少出现这种情况),这点很重要哦!(不是以AR或AE为排序的)
[/Quote]
绕来绕去 你这也就是随便取出来一条就行 是这个意思吗

如果不以ar ae 排序 还能有啥科学的方法来确定你要的那第一条 是
1 AN1 ae1 ar10

而不是

1 AN1 ae1 ar14

或者其它
Leedye 2012-02-11
  • 打赏
  • 举报
回复
谢谢大家的回复: 回1楼:不只是返回结果哦,您的SQL无法去和实际的字段去匹配查询哦;
回4楼:可以Aid为排序,且在实际中每组AE中的每个AR值都允许相同,不同AE组的AR值也允许相同(虽然极少出现这种情况),这点很重要哦!(不是以AR或AE为排序的)
黄_瓜 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 beirut 的回复:]

SQL code

select * from [tb] t where not exists(select 1 from [tb] where [Aid]=t.[Aid]and [AR]<t.[AR])
and[AR] is not null
----------------结果----------------------------
/*
Aid Aname AE AR……
[/Quote]
错了,呵呵 弱弱的问一句 你这个第一行是按照什么排序的?
视图返回的结果是无序的
黄_瓜 2012-02-11
  • 打赏
  • 举报
回复

select * from [tb] t where not exists(select 1 from [tb] where [Aid]=t.[Aid]and [AR]<t.[AR])
and[AR] is not null
----------------结果----------------------------
/*
Aid Aname AE AR
----------- ----- ---- ----
1 AN1 ae1 ar10
2 AN2 ae2 ar20

(2 行受影响)

*/
chuanzhang5687 2012-02-11
  • 打赏
  • 举报
回复
+1[Quote=引用 1 楼 acherat 的回复:]

SQL code

select *
from(
select *,rid=row_number() over (partition by aid order by getdate())
from v
)t
where rid = 1
[/Quote]
AcHerat 2012-02-11
  • 打赏
  • 举报
回复

select *
from(
select *,rid=row_number() over (partition by aid order by getdate())
from v
)t
where rid = 1

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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