如何为postgres中的多对多关系选择不相关的项来构建sql查询?

p4rjhz4m  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(383)

我有编码器和编程语言实体与多对多的关系。数据库结构如下所示:

coder
  - id (primary key)
  - name

proglang
  - id (primary key)
  - name

coder_to_proglang
  - id (primary key)
  - coder_id (foreign key for coder table)
  - proglang_id (foreign key for proglang table)

问题是如何选择特定程序员不知道的编程语言?
我最好的sql查询是:

select p.*, c.id as coder_id
from "proglang" as "p"
         left join "coder_to_proglang" as "j" on "p"."id" = "j"."proglang_id"
         left join "coder" as "c" on "c"."id" = "j"."coder_id"
where j.id is null or c.id != :coderId

我是这样想的:未知语言是指不通过连接表与编码器链接的语言,因此连接表id可以为空,或者该语言可以与不同的编码器链接。但这是行不通的,因为其他编码人员可以知道给定编码人员所知道的相同语言。
我还怀疑我们可以使用一些连接来实现从一组现有语言中减去一组已知语言,但无法理解如何用sql来描述这一点。

cidc1ykv

cidc1ykv1#

创建所有语言的组合(使用 cross join )和代码;然后过滤掉那些存在的:

select c.name as coder, p.name as language
from proglang p cross join
     coder c left join
     coder_to_proglang cp
     on cp.proglang_id = p.id and cp.coder_id = c.id
where cp.coder_id is null;

相关问题