• 用内联结来模拟多人间握手


    有一个团队里,一个人需要所有人握手,第二个人需要和除第一个人之外的所有人握手,第三个人需要和第一第二之外的所有人握手,以此类推...

    下面将用SQL语句来模拟这一过程。

    表结构如下:

    create table hy_emp(
        id number(4,0) not null primary key,
        name varchar2(20) not null)

    插值:

    insert into hy_emp values(52,'Eliot');
    insert into hy_emp values(6,'Felix');
    insert into hy_emp values(7,'Green');
    insert into hy_emp values(86,'Hellen');
    insert into hy_emp values(11,'Andy');
    insert into hy_emp values(12,'Bill');
    insert into hy_emp values(3,'Cindy');
    insert into hy_emp values(4,'Douglas');

    注意人员的id顺序是打乱的,我们需要按字母序给加上一个列序号。

    select row_number() over (order by name asc) as rn,name from hy_emp order by name

    然后用内联结模拟握手:

    select a.name||' shaked hands with '||b.name
    from
    (select row_number() over (order by name asc) as rn,name from hy_emp order by name) a
    inner join 
    (select row_number() over (order by name asc) as rn,name from hy_emp order by name) b
    on a.name<>b.name  --连接条件,和除自己外的所有人握手
    where a.rn<b.rn  --过滤条件,rn值在前,已经握过手的就不握手了

    执行情况:

    SQL还可以简化如下:

    select a.name||' shaked hands with '||b.name
    from
    (select row_number() over (order by name asc) as rn,name from hy_emp ) a
    inner join 
    (select row_number() over (order by name asc) as rn,name from hy_emp ) b
    on a.rn<b.rn

    执行情况:

    本例用到的所有SQL:

    create table hy_emp(
        id number(4,0) not null primary key,
        name varchar2(20) not null)
        
    
    insert into hy_emp values(52,'Eliot');
    insert into hy_emp values(6,'Felix');
    insert into hy_emp values(7,'Green');
    insert into hy_emp values(86,'Hellen');
    insert into hy_emp values(11,'Andy');
    insert into hy_emp values(12,'Bill');
    insert into hy_emp values(3,'Cindy');
    insert into hy_emp values(4,'Douglas');
    
    commit;
    
    truncate table hy_emp;
    
    select row_number() over (order by name asc) as rn,name from hy_emp order by name
    
    select a.name||' shaked hands with '||b.name
    from
    (select row_number() over (order by name asc) as rn,name from hy_emp order by name) a
    inner join 
    (select row_number() over (order by name asc) as rn,name from hy_emp order by name) b
    on a.name<>b.name
    where a.rn<b.rn

    select a.name||' shaked hands with '||b.name
    from
    (select row_number() over (order by name asc) as rn,name from hy_emp ) a
    inner join
    (select row_number() over (order by name asc) as rn,name from hy_emp ) b
    on a.rn<b.rn

    --2020-03-30--

  • 相关阅读:
    一张图告诉你为什么是服务网关,文末有现金抽奖。
    Java中的宏变量,宏替换详解。
    Java中创建String的两道面试题及详解
    JSON Web Token (JWT),服务端信息传输安全解决方案。
    jdk紧急漏洞,XMLDecoder反序列化攻击
    Java对象引用四个级别(强、软、弱、虚)
    Java7任务并行执行神器:Fork&Join框架
    (2)Django-pycharm部署
    批处理编写
    (1)Django安装
  • 原文地址:https://www.cnblogs.com/heyang78/p/12597911.html
Copyright © 2020-2023  润新知