Mysql double not exists子句是什么意思?

Mysql double not exists子句是什么意思?,mysql,sql,relational-division,Mysql,Sql,Relational Division,我不知道代码是什么意思。。。有人能大致地告诉我代码的作用吗?C是一名客户,由一名工人负责 该查询选择由所有员工照顾的客户 双重不存在是一种实现的方法。作为Andomar出色答案的一个例子: SELECT c.name FROM Customer c WHERE NOT EXISTS(SELECT w.WID FROM Woker w WHERE NOT EXISTS(SELECT la

我不知道代码是什么意思。。。有人能大致地告诉我代码的作用吗?C是一名客户,由一名工人负责

该查询选择由所有员工照顾的客户


双重
不存在
是一种实现的方法。

作为Andomar出色答案的一个例子:

SELECT c.name
FROM   Customer c
WHERE  NOT EXISTS(SELECT w.WID
                  FROM   Woker w
                  WHERE  NOT EXISTS(SELECT la
                                    FROM   look_after la
                                    WHERE  la.CID = c.CID
                                           AND la.WID = w.WID)); 
结果:

    -- Some test data
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE persons
        ( person_id  INTEGER NOT NULL PRIMARY KEY
        , pname   varchar
        );
INSERT INTO persons( person_id, pname ) VALUES
 (1 , 'Bob' ) ,(2 , 'Alice' ) ,(3 , 'Carol' )
        ;

CREATE TABLE movies
        ( movie_id  INTEGER NOT NULL PRIMARY KEY
        , mname   varchar
        );
INSERT INTO movies( movie_id, mname ) VALUES
 (1, 'The Blues brothers' ), (2, 'Modern Times' ), (3, 'The Sound of Music' )
,(4, 'Amadeus' ), (5, 'Never say Never' )
        ;

        -- people that have seen a particular movie
CREATE TABLE person_movie
        ( person_id  INTEGER NOT NULL
        , movie_id INTEGER NOT NULL
        , PRIMARY KEY ( person_id, movie_id)
        );
INSERT INTO person_movie( person_id, movie_id) VALUES
 (1 ,5 ) ,(1 ,1 )
,(2 ,5 ) ,(2 ,4 ) ,(2 ,1 ) ,(2 ,3 ) ,(2 ,2 )
,(3 ,1 ) ,(3 ,3 )
        ;

        -- Find the people that have seen ALL the movies
        -- This is equivalent to:
        -- Find persons for whom NO movie exists that (s)he has NOT seen
SELECT * FROM persons p
WHERE NOT EXISTS (
        SELECT * FROM movies m
        WHERE NOT EXISTS (
                SELECT * FROM person_movie pm
                WHERE pm.movie_id = m.movie_id
                AND pm.person_id = p.person_id
                )
        );

        -- similar: Find the movies that have been seen by ALL people
SELECT * FROM movies m
WHERE NOT EXISTS (
        SELECT * FROM persons p
        WHERE NOT EXISTS (
                SELECT * FROM person_movie pm
                WHERE pm.movie_id = m.movie_id
                AND pm.person_id = p.person_id
                )
        );                                             

应该没有“不是”:“由所有工人照看”@ypercube:没有不照看客户的工人。所以我觉得现在的版本还可以。但很难理解双重否定。该查询显示了所有员工都无一例外地照顾的客户。@ypercube:看起来你是对的。有点太难了,以至于在生产中使用时没有注释:)这在什么意义上是离题的?这是一个“特定编程问题”,在分析SQL专家建立的数据库时经常遇到;这是关于SQL编程,但是编程,因此是关于主题的。@Andomar选择“主题外”的原因是关于展示对所解决问题的最低理解;还有更多的离题原因与前面的不完全相同。也就是说,我不知道具体的关闭原因是否适用,我正在重新打开它。@JonathanLeffler查看我对Andomar的上述评论。
 person_id | pname 
-----------+-------
         2 | Alice
(1 row)

 movie_id |       mname        
----------+--------------------
        1 | The Blues brothers
(1 row)