zoukankan      html  css  js  c++  java
  • SQL 表的自连接 不等值连接

    题目内容:
    一个表T_20161004
    ID 字段为编号,递增不一定连续
    uPrice 字段为区段路费,比如从家到哈尔滨是60元,从哈尔滨到长春是70元 数值类型
    Name 字段站点名称。
    现在有500元钱, 从家先经哈尔滨出发, 能走多远?
    ID uPrice Name
    1 60 哈尔滨
    2 70 长春
    3 80 沈阳
    4 50 北京
    5 90 郑州
    6 75 武汉
    7 80 长沙
    8 90 广州

    要求:请用一句SQL语句实现

    CREATE TABLE T_20161004(
    ID INT IDENTITY(1,1) NOT NULL,
    uPrice INT,
    Name VARCHAR(10)
    )
    INSERT INTO T_20161004 VALUES(60,'哈尔滨')
    INSERT INTO T_20161004 VALUES(70,'长春')
    INSERT INTO T_20161004 VALUES(80,'沈阳')
    INSERT INTO T_20161004 VALUES(50,'北京')
    INSERT INTO T_20161004 VALUES(90,'郑州')
    INSERT INTO T_20161004 VALUES(75,'武汉')
    INSERT INTO T_20161004 VALUES(80,'长沙')
    INSERT INTO T_20161004 VALUES(90,'广州')
    
    
    -- 方法一 交叉连接  不等值连接 不容易理解
    SELECT TOP 1 b.id, b.NAME, SUM(a.uprice) s_sum
    FROM T_20161004 a , T_20161004 b 
    WHERE a.id<=b.id
    GROUP BY b.id,b.name
    HAVING SUM(a.uprice)<=500
    ORDER BY b.id DESC
    
    -- 方法二 自连接
    SELECT TOP 1 b.id,b.NAME,SUM(a.uprice) s_sum
    FROM  T_20161004 a 
    INNER JOIN T_20161004 b ON a.id<=b.id  --不等值连接
    GROUP  BY  b.id,b.name
    HAVING SUM(a.uprice)<=500
    ORDER BY b.id DESC
    
    -- 方法三 子查询 比较容易理解
    
    SELECT TOP 1 ID, NAME, M_SUM
    FROM (SELECT *, (SELECT SUM(uprice) from T_20161004 
    		WHERE  ID <= A.ID) AS M_SUM
    		FROM T_20161004 A ) B 
    WHERE M_SUM<=500
    ORDER BY ID DESC 
    
    /* 子查询步骤
    1. 外部查询获得一条记录并将其传入内部查询;
    2. 基于传入的值进行内部查询
    3. 内部查询将自己返回的结果值传给外部查询,外部查询利用这些值完成自己的处理。
    */
    SELECT *, (SELECT SUM(uprice) from T_20161004 
    		WHERE  ID <= A.ID) AS M_SUM
    		FROM T_20161004 A 
    

      

  • 相关阅读:
    《团队-爬取豆瓣Top250-团队一阶段互评》
    团队-爬虫豆瓣top250项目-开发文档
    结对总结
    课后作业-阅读任务-阅读提问-2
    2017-10-06-构建之法:现代软件工程-阅读笔记
    结对-结对编项目贪吃蛇-开发过程
    团队-爬取豆瓣电影TOP250-开发环境搭建过程
    个人-GIT使用方法
    课后作业-阅读任务-阅读提问-1
    课后作业-阅读任务-阅读笔记-1
  • 原文地址:https://www.cnblogs.com/intheway/p/5930814.html
Copyright © 2011-2022 走看看