双重不存在子句是啥意思?
Posted
技术标签:
【中文标题】双重不存在子句是啥意思?【英文标题】:What does a double not exists clause mean?双重不存在子句是什么意思? 【发布时间】:2013-06-30 15:46:57 【问题描述】: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));
我不知道代码的含义...谁能大致告诉我代码的作用? C 是一名客户,他将由一名工人照顾。
【问题讨论】:
在什么意义上这是题外话?这是一个“特定的编程问题”,在分析 SQL 专家设置的数据库时经常遇到。 这对 SO 来说非常合适;它是关于 SQL 编程的,但也是关于编程的,因此是关于主题的。 @Andomar 选择“离题”的原因是为了表明对正在解决的问题的了解最少;还有更多与前面的不完全一样的离题原因。也就是说,我不知道具体的关闭原因是否适用,我正在重新打开它。 @JonathanLeffler 请参阅我对 Andomar 的上述评论。 【参考方案1】:查询选择由所有工作人员照顾的客户。
双重not exists
是实现relational division的一种方式。
【讨论】:
应该没有“不”:“被所有工人照顾” @ypercube:不存在不照顾客户的工人。所以我认为当前版本还可以。虽然很难阅读双重否定。 查询显示所有员工无一例外地照顾的客户。 @ypercube:看起来你是对的。在没有 cmets 的情况下很难在生产环境中使用 :)【参考方案2】:作为 Andomar 出色回答的一个例子:
-- 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
)
);
结果:
person_id | pname
-----------+-------
2 | Alice
(1 row)
movie_id | mname
----------+--------------------
1 | The Blues brothers
(1 row)
【讨论】:
以上是关于双重不存在子句是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
linux网卡启动不起来,出现设备不存在是啥意思???????