我的编码器和编程语言实体具有多对多关系。数据库结构如下:
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可以为NULL,或者该语言可以与其他编码器链接。但这是行不通的,因为其他编码人员可以知道给定编码人员所知道的相同语言。
我还怀疑我们可以使用某种联接来从一组所有现有语言中减去一组已知语言,但无法弄清楚如何在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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句