zoukankan      html  css  js  c++  java
  • 用内联结来模拟多人间握手

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

    下面将用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--

  • 相关阅读:
    Zabbix 配置笔记
    Centos7安装MySQL5.7和Redis6.0流水账
    Elasticsearch, Kibana安装
    服务治理 Service Mesh & Kubernetes & Spring Cloud的异同 侵入式 非侵入式
    文思海辉 华为 银行 ODS (oCRM)
    Java Profiler JavaMemoryLeak Arthas
    动物:人类、熊类、马类 团队精神 与 鼓励
    BPMN Sketch Miner https://design.inf.usi.ch/bpmn-sketch-miner/#
    Architecture, Design and Web Information Systems Engineering
    Cloud design patterns
  • 原文地址:https://www.cnblogs.com/heyang78/p/12597911.html
Copyright © 2011-2022 走看看