sql - 复杂的SQL语句: select that matches on multiple tables

标签 sql

我有以下表格:

  • Candidates
  • CandidateLanguages
  • CandidateSkills

  • 每个候选人可能拥有超过 1 种语言和超过 1 项技能

    所以对于 Candidate “FRED”,他的记录在 CandidateLanguages或许
    FRED - ENGLISH
    FRED - FRENCH
    

    以及他在 CandidateSkills 中的记录或许
    FRED - RUNNING
    FRED - JUMPING
    

    Candidate “JIM”他的记录CandidateLanguages或许
    JIM - ENGLISH
    

    以及他在 CandidateSkills 中的记录或许
    JIM - RUNNING
    

    我的查询需要选择匹配多种技能和语言的候选人。

    所以例如在英语中:

    选择所有会说所有选定语言并拥有所有选定技能的候选人...

    或者换一种方式......
    SELECT ALL candidates WHERE 
    (language = 'FRENCH' AND language is 'ENGLISH') AND 
    (skill = 'RUNNING' AND skill = 'JUMPING') 
    

    在上面的两个候选人中,这应该只返回“FRED”

    我知道问题在于尝试从语言和技能表中选择多个记录,我认为可能需要连接,但现在我迷路了......

    最佳答案

    您正在解决的问题名为 关系科 .

    看这篇文章: Divided We Stand: The SQL of Relational Division 以及这个问题的几种解决方法: How to filter SQL results in a has-many-through relation

    解决它的一种方法(通常是最有效的):

    SELECT ALL c.candidate
    FROM Candidates c
      JOIN CandidateLanguages lang1
        ON  lang1.candidate = c.candidate 
        AND lang1.language = 'English'
      JOIN CandidateLanguages lang2
        ON  lang2.candidate = c.candidate 
        AND lang2.language = 'French'
      JOIN CandidateSkills sk1
        ON  sk1.candidate = candidate 
        AND sk1.skill = 'Running'
      JOIN CandidateSkills sk2
        ON  sk2.candidate = candidate 
        AND sk2.skill = 'Jumping' ;
    

    另一种看起来更容易编写的方法,尤其是在涉及很多语言和技能的情况下,是使用带有 GROUP BY 的两个派生表。在他们每个人中:
    SELECT ALL c.candidate
    FROM Candidates c
      JOIN 
        ( SELECT candidate
          FROM CandidateLanguages
          WHERE language IN ('English', 'French')
          GROUP BY candidate
          HAVING COUNT(*) = 2                     -- the number of languages
        ) AS lang
          ON  lang.candidate = c.candidate 
      JOIN 
        ( SELECT candidate
          FROM CandidateSkills 
          WHERE skill IN ('Running', 'Jumping')
          GROUP BY candidate
          HAVING COUNT(*) = 2                     -- the number of skills
        ) AS sk
          ON  sk.candidate = c.candidate ;
    

    关于sql - 复杂的SQL语句: select that matches on multiple tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17506444/

    相关文章:

    sql - 错误报告 : ORA-06550: line 7, 列 134 : PL/SQL: ORA-00913: too many values ORA-06550: line 7,

    php - Mysql 将资源 #16 插入数据库表

    sql - postgres 中的行级安全性 (RLS) 性能明显较慢。

    sql - 如何删除sql表中的特定行

    sql - Oracle DB SQL - 检查每个月是否至少存在一个数据集

    mysql - 使用 MySQL 中同一选择查询的数据运行多次插入

    sql - PostgreSQL - "DISTINCT ON"和 "GROUP BY"语法

    mysql - 我的列表中的哪些条目在我的表中没有条目?

    sql - Doctrine 查询 - 忽略空格

    java - 如何创建属于一个用户 SQL 的许可证值