Note the size of this set can get pretty large, so I don’t want to join the table to itself n times.
无论你怎么动摇它,每种语言都会有联系.您正在寻找一个值(程序员),其中每个另一个值(语言)至少存在一行.这意味着您需要考虑同一个表的N个不同视角.
在大多数情况下,您可能最有效率地进行连接.如果结果集足够密集(实际上,大多数程序员都会说python和c),你可以采用一些聪明之处.首先查询析取,但唯一,然后由程序员对结果关系进行分组,并筛选出语言太少的那些…
SELECT programmer
FROM ( SELECT DISTINCT programmer, language
FROM speaks_table
WHERE language in ('C++', 'python') ) AS disjunction
GROUP BY disjunction.programmer
HAVING count(disjunction.language) = 2
但是,这比普通的ol’多路连接更好,取决于所涉及的确切数据.这至少具有不需要生成查询的优点,这取决于所讨论的语言的数量.