如何在 Postgres 中为多对多关系构建 SQL 查询选择不相关的项目?

How to build SQL query selecting not related items for many-to-many relation in Postgres?

我有 CoderProgramming language 具有多对多关系的实体。数据库结构如下:

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)

问题是特定编码人员如何select编程语言未知

我最好的 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

我是这样想的:未知语言是不通过 table 与编码器 link 编辑的语言,因此 table ID 可以是 [=23] =]NULL,或者该语言也可以有 link 与不同的编码器。但这行不通,因为其他编码员可以知道给定编码员所知道的相同语言。

我还怀疑我们可以使用一些连接来实现从一组所有现有语言中减去一组已知语言,但无法弄清楚如何在SQL中描述这一点。

创建所有语言(使用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;