CREATE TABLE [A] ([name] [varchar](20),[age] [int],[num] [int])
INSERT INTO [A]
SELECT N'Jack',18,1 UNION ALL
SELECT N'Jack',18,2 UNION ALL
SELECT N'Mike',22,3 UNION ALL
SELECT N'Jack',18,4 UNION ALL
SELECT N'Jack',18,5 UNION ALL
SELECT N'Grace',14,6 UNION ALL
SELECT N'Mike',22,7
Select * from A B where exists(select * from A where name=B.name and num<B.num)这条语句帮我讲解一下好吗?
我肯能理解进入了歧途,我认为查询出来的应该是
Jack 18 1
Jack 18 2
Mike 22 3
Jack 18 4
,而查询出来结果是
Jack 18 2
Jack 18 4
Jack 18 5
Mike 22 7
这是为什么呢?我不能理解,为什么最小的反而被取消了呢?

解决方案 »

  1.   

    就是如果name相等就取 num 小的
      

  2.   

    Select * from A B where exists(select 1 from A where A.name=B.name and A.num>B.num)
      

  3.   


    Select A.*
    from A B 
    INNER JOIN A name = B.name 
    where num < B.num
    实际上是自连接
      

  4.   

    我知道B是A的别名
    实际就是两张一样的表num大小的比较,为何将最小的反而取消了呢
      

  5.   

    Select * from A B where exists(select * from A where name=B.name and num<B.num)存在比外面小的,所以显示的是大的
      

  6.   

    Select * from A B where exists(select * from A where name=B.name and num>B.num)
      

  7.   

    我想要的结果就是
    Jack 18 2
    Jack 18 4
    Jack 18 5
    Mike 22 7可是我理解的那句查询语句,我认为的结果是
    Jack 18 1
    Jack 18 2
    Mike 22 3
    Jack 18 4
    也就是说我理解的错误,我想那位告诉我下我是那里错误的
      

  8.   

    照我的理解exists返回的只是真假,当num=1的时候,符合条件的记录没有,返回内容为假
    自然就搜索不出这条记录的内容了!
      

  9.   

    谢谢xyj052和nightmaple,以及其他朋友
    本人新手所以分数不多,只好给这2位朋友分数。
      

  10.   

    把你后面的条件改下,写成这样,就可以看到你要的效果了Select * from A B where exists(select * from A where  num>B.num)