Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要有关内部联接(自联接)的帮助_Sql_Oracle_Inner Join - Fatal编程技术网

Sql 需要有关内部联接(自联接)的帮助

Sql 需要有关内部联接(自联接)的帮助,sql,oracle,inner-join,Sql,Oracle,Inner Join,我有一个具有以下架构的表: Table1 Id varchar2 name varchar2 class varchar2 JoinDate date size number 主键是id、name、class 查询特定Id时,我希望返回按类分组的总和(大小),结果应基于以下条件: 只考虑具有与我不同ID的行 只考虑与我< /LI>具有相同名称的行 如果另一个id的名称类组合与我的id的名称类组合相匹配,则只要JoinDate小于该名称类组合的我的JoinDat

我有一个具有以下架构的表:

Table1
Id       varchar2
name     varchar2
class    varchar2
JoinDate date
size     number
主键是id、name、class

查询特定Id时,我希望返回按类分组的总和(大小),结果应基于以下条件:

只考虑具有与我不同ID的行 只考虑与我< /LI>具有相同名称的行
  • 如果另一个id的名称类组合与我的id的名称类组合相匹配,则只要JoinDate小于该名称类组合的我的JoinDate,就在总和中包含大小
  • 如果另一个Id的名称类组合与我的Id的名称类组合不匹配,则始终将大小包含在总和中

    select 
        others.class,
        sum( case when others.class = mine.class and others.joindate <= mine.joindate then size
            when others.class = mine.class and others.joindate > mine.joindate then 0
            else size ) total_size
    from 
        table1 others
    inner join table1 mine
      on mine.name = others.name and
         mine.id != others.id
    where mine.name = :name and
          mine.id = :id
    group by class
    
    我想要的是:

    Class1 1
    Class2 1
    Class3 0
    Class4 0
    

    这不是我得到的。

    内部联接确保至少存在一个关系——获取零的唯一方法是使用子选择或左联接。尝试:

       SELECT a.class,
              SUM(COALESCE(b.size, 0)) 
         FROM (SELECT DISTINCT t.class
                 FROM TABLE1 t) a
    LEFT JOIN TABLE1 b ON b.class = a.class
                      AND EXISTS (SELECT NULL
                                    FROM TABLE 1 x
                                   WHERE x.name = :name
                                     AND x.id = :id
                                     AND x.id != b.id
                                     AND x.name = b.name
                                     AND x.joindate >= b.joindate)
     GROUP BY a.class
    

    这是一个糟糕的主键:(他的PK唯一的问题是,它不是ID列,这是人们会假设的。多值PKs没有错。@Daniel对于这种设计来说,它是一个糟糕的主键。为什么我只能假设ID列是唯一的,可能是自动递增的,而不只是使用它作为主键?其他两列是什么是否将添加到有助于唯一标识每行的键?
       SELECT a.class,
              SUM(COALESCE(b.size, 0)) 
         FROM (SELECT DISTINCT t.class
                 FROM TABLE1 t) a
    LEFT JOIN TABLE1 b ON b.class = a.class
                      AND EXISTS (SELECT NULL
                                    FROM TABLE 1 x
                                   WHERE x.name = :name
                                     AND x.id = :id
                                     AND x.id != b.id
                                     AND x.name = b.name
                                     AND x.joindate >= b.joindate)
     GROUP BY a.class