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时,我希望返回按类分组的总和(大小),结果应基于以下条件:
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