if object_id('tb') is not null drop table tb
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')select * from tb a where not exists (select 1 from tb b where b.name = a.name and b.val > a.val)
select * from tb a where not exists (select 1 from tb b where b.name = a.name and a.val > b.val)
下面2个查询的结果是
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
=========================================
a 1 a1--a的第一个值
b 1 b1--b的第一个值
搞糊涂了

解决方案 »

  1.   

    字符串比较大小是从第一个字符开始挨个比较ASCII码的,这样说明白了吗
      

  2.   

    分组查询name相同 val最小的值啊
      

  3.   

    字符串比较大小是从第一个字符开始挨个比较ASCII码
    这个理解但是对查询结果不是很明白。
      

  4.   

    字符串比较是按每一个ASCII比较
      

  5.   

    我那边条件等于号反了现实效果也不一样
    这个和ASCII比较啥关系啊
    高手能不能帮我讲具体点啊
      

  6.   

    第一个语句是取相同名字当中,val值最大的那条
    第二个语句是取相同名字当中,val值最小的那条。有什么问题么?
      

  7.   

    select * from tb a where not exists (select 1 from tb b where b.name = a.name and b.val > a.val)
    语句的作用是取相同NAME中VAL最大的,因为有两个NAME A,B,所以有两条记录。
    A的记录中
    insert into tb values('a',    2,   'a2(a的第二个值)')
    insert into tb values('a',    1,   'a1--a的第一个值')
    insert into tb values('a',    3,   'a3:a的第三个值')
    先比较第一个字符,都是a,相等,再比较第二个字符,分别是2,1,3。3的ASCII码最大,所以
    insert into tb values('a',    3,   'a3:a的第三个值')
    这条记录显示。B是一样的。
      

  8.   

    语句功能了解
    想问的是为啥一个是
    b.val > a.val
    另一个
    a.val > b.val
    出现的效果怎么不一样啊
    一个是同组的最大值
    一个是最小值
      

  9.   

    以外围表A的一个name为例:
    --第一个语句
    --以name='a'为例子select * from tb a where not exists (select 1 from tb b where b.name = a.name and b.val > a.val)在表a中找一条记录,满足2条件:
    1:name='a'
    2:并且b中不存在val大于a中val的记录,显示a中val最大的那条记录3,在b里没有比3更大的
    ---第2个同理