首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于表自连接的问题,一直没搞明白 [已结贴,结贴人:sjt000]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjt000
    • 等级:
    发表于:2008-06-25 15:54:47 楼主
    拿前几天看到的一个来做例子
    表 Userinfo
    Emp_id  Ebs  Eas
    ------------------
    1      1      1
    2      1      2
    3      1      3
    4      2      1
    5      2      2
    6      2      3

    想要得到这样的结果

    Emp_id  Ebs  Eas  total(Ebs+Eas) (total)排名
    ---------------------------------------------
    1      1      1        2              4
    2      1      2        3              3
    3      1      3        4              2
    4      2      1        3              3
    5      2      2        4              2
    6      2      3        5              1


    Sql:
    select *,EBS+EAS as total,(select Count(distinct EBS+EAS) from Userinfo where EBS+EAS>=a.EBS+a.EAS) as mingci from Userinfo a

    小弟一直没弄明白这里面具体是个则么回事
    1:from Userinto a 这种连接是属于那种连接?是怎么连的?
    2:把上个Sql语句改为select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from a where EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a 为什么就不行?

    困扰很久啦,望各位兄弟姐妹不吝赐教哈。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 16:04:141楼 得分:70
    1:from Userinto a 这种连接是属于那种连接?是怎么连的?
    -- 可以看作是传了一个查询条件进去即可,应该不是看作连接吧.2:把上个Sql语句改为select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from a where EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a 为什么就不行?
    -- 你这句写的有问题吧,
    select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from [color=#FF0000]a
    where EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a
    另外,关于>=和 <=是要看你具体的要求.[/color]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjt000
    • 等级:
    发表于:2008-06-25 16:28:192楼 得分:0
    这个条件是怎样的呢?
    a.ebs a.eas在条件中又是那一个值呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 16:29:143楼 得分:5
    1、from Userinto a 非一种连接,是将表userinfo起个别名“a”,完整语法是from Userinto as a ,但通常将as略去
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjt000
    • 等级:
    发表于:2008-06-25 16:29:174楼 得分:0
    第二个只是把条件换了一下.为什么不行呢? a是不是一个别名表呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 16:32:045楼 得分:1
    我好像记得帮助中说,from Userinto a 这样的a是Userinto的别名。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 16:35:026楼 得分:0
    select *,EBS+EAS as total,(select Count(distinct EBS+EAS) from Userinfo where EBS+EAS>=a.EBS+a.EAS) as mingci from Userinfo a
    -----------
    红色部分相当于一个子查询,只是子查询的where条件中的值a.EBS+a.EAS来源于外层的查询中的每行的对应值而已.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 20:11:377楼 得分:0
    有些东西是很难有语言描述清楚的,,还是楼主自己体会吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kldxdybb
    • 等级:
    发表于:2008-06-25 20:46:408楼 得分:5
    引用 6 楼 hery2002 的回复:
    select *,EBS+EAS as total,(select Count(distinct EBS+EAS) from Userinfo where EBS+EAS>=a.EBS+a.EAS) as mingci from Userinfo a
    -----------
    红色部分相当于一个子查询,只是子查询的where条件中的值a.EBS+a.EAS来源于外层的查询中的每行的对应值而已.


    这么说好理解。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 00:00:419楼 得分:8
    可以就一行一行的分析。

    先从排在第一位的理解:

    Emp_id      Ebs        Eas        total      mingci
    ——----------------------------------------------------
    6          2          3          5          1


    (select Count(distinct EBS+EAS) from Userinfo where EBS+EAS>=a.EBS+a.EAS)
    可以这样:

    select Count(distinct EBS+EAS) from Userinfo where EBS+EAS>=(2+3)

    意思是说从Userinfo表中查询条件为EBS+EAS>=(2+3)的行数,我们从表数据可以得,满足条件的只有一条,
    所以排在第一位了。

    使用Count(distinct EBS+EAS)的目的是,当 EBS+EAS值相同,排名相同。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 00:12:4210楼 得分:1
    2:把上个Sql语句改为select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from a where EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a 为什么就不行?

    不是不行,只是与上一行的结果排序刚好相反,只是你理解错了。
    这样写的话就是变成,total最小的时候,排在第1位,最大的排在后面。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 08:57:3311楼 得分:1
    lz可以按for循环来理解,其实遍历表就是这样的。

    首先,基础表为userinfo,处理第一条记录时,你说的那个select count就是找比第一条合值大于等于的求统计,这样就能算出排名了,注意distinct的作用。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjt000
    • 等级:
    发表于:2008-06-26 09:46:2912楼 得分:0
    非常感谢,特别是hery2002,第一个问题明白了。
    但第二个问题还是有点不明白,改了之后语句是不能运行的。

    如果说
    select *,EBS+EAS as total,(select Count(distinct EBS+EAS) from Userinfo where EBS+EAS>=a.EBS+a.EAS) as mingci from Userinfo a
    中的a.EBS+a.EAS相当于外层的每行对应的值,那为什么
    select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from a where EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a
    中把EBS+EAS理解成外层每行对应的值,对别名表a中进行查询,在a中比EBS+EAS大的数目,为什么就不行呢???

    难道说在子查询中不能查询别名表,只能查原表,用别名表中的数据表示外层数据????

    各位大大,希望指点迷津哈,分不够还可以另再加
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjt000
    • 等级:
    发表于:2008-06-27 09:13:3713楼 得分:0
    up 一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 12:11:3714楼 得分:1
    select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from Userinfo aa where EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • HEROWANG
    • 等级:
    发表于:2008-06-27 12:19:2215楼 得分:8
    1:from Userinto a 这种连接是属于那种连接?是怎么连的?
    ---->没有使用连接,这个表示给userinto取一个别名为a2:把上个Sql语句改为select *,EBS+EAS as total,(select Count(distinct a.EBS+a.EAS) from a ---这块当然不行,不存在a这个表,这块不能使用后面的awhere EBS+EAS <=a.EBS+a.EAS) as mingci from Userinfo a 为什么就不行?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ranzj
    • 等级:
    发表于:2008-06-27 12:22:2416楼 得分:0
    好复杂啊,已经晕了.
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved