postgresql在此表上连接(如果不为null或那样)

时间:2019-01-20 19:10:28

标签: sql postgresql join

我对此已经疯了一段时间了,我敢肯定,目前正在做的事情比较简单,但是却找不到答案,可能是因为我无法将手指放在正确的问题上

我将通过一个简单的示例进行说明: 假设我有3张桌子

父亲:

| id  | name |

儿子:

| id |father_id  | name |

书籍:

| id  | son_id | father_id |name |

我想要一个可以给我的查询:

[father] | [son] | [book]

---------   ----   -----

father1| son1 | book1

father1 |son1 | book5

father1,son2,book2

father1,none,book3

father1,none,book4

father2...

我有:

select fathers.name,sons.name,books.name 
from fathers left join sons on son.father_id=fathers.id 
left join books on ...

在这里感谢任何帮助!

更新:

似乎一本书分配给儿子,它也分配给父亲。

这是我当前的查询:

select fathers.name,sons.name,books.name 
from 
    fathers 
    left join sons on son.father_id=fathers.id 
    left join books on (
        (books.father_id=fathers.id and books.son_id is null) 
        or ((books.son_id=sons.id )
    ) 
group by fathers.name,sons.name,books.name

但这在子列上并没有为我提供条件“无”。

1 个答案:

答案 0 :(得分:1)

您的 son 表已经与 father 表有关系,因此 book 表中的 father_id 字段是多余的如果书是只给儿子而不是给父亲的,那是多余的!否则,如果父亲和儿子都可以有书,那么您就必须left join book 表,同时包含父亲 son 表;我的意思是您想要的查询如下所示:

select f.name, s.name, b.name 
from  Books b left join fathers f on b.father_id=f.id
      left join sons s on b.son_id=s.id