在sqlalchemy中连接表并按组过滤

时间:2014-03-27 09:27:40

标签: sql join sqlalchemy

表A必须与B外连接。

A

id | ...
---|-----
1  |
2  |   
3  |
---|-----

id| a_id | b       | ...
--|------|----------
1 |1     | special |
2 |1     | normal  |
3 |2     | normal  |
4 |2     | normal  |
--------------------

所以我想:

A.outerjoin(B)

像这样:

a_id | b.id | ...
-----|------|--------
2    | 3    |normal  |
2    | 4    |normal  |
3    | None |
-----|------|
  1. 我应该使用什么过滤具有至少一个“特殊”值的相同a_id 的整个B组?
  2. 我不想丢失外连接 - 对于a.id = 3没有。
  3. 我的第一个想法是使用嵌套选择,但它并不是最佳选择。

1 个答案:

答案 0 :(得分:0)

select distinct a.* 
from a join b on a.id=b.a_id 
where b.b='special';

排除具有“特殊”

的群组
select a.* 
from a outer join
    (select distinct a.* 
     from a join b on a.id=b.a_id 
     where b.b='special') excluded on a.id=excluded.id
having excluded.id is null;

只留下有效的行。

select *
from (select a.* 
from a outer join
    (select distinct a.* 
     from a join b on a.id=b.a_id 
     where b.b='special') excluded on a.id=excluded.id
having excluded.id is null) outer join b on a.id=b.a_id;

外部有效行与b

连接