【问题标题】:How to build SQL query selecting not related items for many-to-many relation in Postgres?如何在 Postgres 中为多对多关系构建 SQL 查询选择不相关的项目?
【发布时间】:2020-06-08 16:11:43
【问题描述】:

我有具有多对多关系的 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)

问题是如何选择特定编码人员未知的编程语言?

我最好的 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 中描述这一点。

【问题讨论】:

    标签: sql postgresql join select many-to-many


    【解决方案1】:

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

    【讨论】:

    • 再次感谢您,效果很好。也许您可以建议一些资源以不太困难的方式很好地解释连接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多