SQLite中的所有运算符替代

时间:2018-02-21 06:46:38

标签: sqlite

我试图找出在SQL中使用all的等价物,在sqlite中(它不支持'all'运算符)。例如,我想查询教授与John Smith相同课程的教师。

我试图理解为什么我的流程不正确。

select distinct instructor
from testTable
where not exists(
    select course from testTable where not exists (
        select course from testTable where instructor = 'John Smith')
)

我背后的想法是找到所有不是约翰史密斯教授的课程,然后外部不存在将返回所有教授与约翰史密斯相同课程的教师。

示例输入和输出:

CREATE TABLE testTable (instructor TEXT, course TEXT);
INSERT INTO testTable values ('John Doe', 'Math');
INSERT INTO testTable values ('John Doe', 'English');
INSERT INTO testTable values ('John Doe', 'Physics');
INSERT INTO testTable values ('Jane Doe', 'Math');
INSERT INTO testTable values ('John Smith', 'Physics');
INSERT INTO testTable values ('John Smith', 'Math');
INSERT INTO testTable values ('Janice Smith', 'English');
INSERT INTO testTable values ('Janice Smith', 'Physics');
INSERT INTO testTable values ('James Smith', 'Math');
INSERT INTO testTable values ('James Smith', 'Physics');

输出应为:

James Smith
John Smith
John Doe

1 个答案:

答案 0 :(得分:1)

一种方法是使用自我加入,然后由教师进行聚合,以检查匹配课程的数量是否与John Smith的名单一致。

SELECT t1.instructor
FROM testTable t1
INNER JOIN testTable t2
    ON t1.course = t2.course AND
       t2.instructor = 'John Smith'
GROUP BY
    t1.instructor
HAVING
    COUNT(*) = (SELECT COUNT(*) FROM testTable WHERE instructor = 'John Smith');

这个答案假定给定的教师/课程对只出现一次而不是一式两份。如果没有,则需要稍微修改上述查询。