SQL:从谓词逻辑到SQL SELECT

时间:2015-02-23 10:14:52

标签: sql predicate

我试图了解如何有效地将谓词逻辑转换为SQL查询。我被困在:

For all P(x), (for all P(y), (Knows(x,y) -> Likes(x,y)))

我进一步翻译成:

-exists P(x), (exists P(y), (Knows(x,y) /\ -Likes(x,y)))

使用as'公式':

for all x, (A -> B) <=> -exists x, (A /\ -B); for all x, (A) <=> -exists x, (-A)

如果出错的概率,这是最初的发音:

Write a query that returns the name of all persons that like everyone they know.

其中Knows和Likes表都不对称且只包含Person表的外键,因此表示Person X Knows / Likes Person Y。

对于以上内容,SQL SELECT查询的外观如何?

我试过这个但是没有工作:

SELECT P.name 
FROM Persons P 
WHERE NOT EXISTS (
    SELECT * 
    FROM Knows K 
    WHERE K.personB_id NOT IN (
        SELECT L.personB_id 
        FROM Likes L 
        WHERE K.personA_id = L.personA_id 
        AND K.personB_id <> L.personB_id))

1 个答案:

答案 0 :(得分:2)

查找了解他们不喜欢的人的列表。然后选择他们不在那里的人。

SELECT FROM Persons
    WHERE Persons.ID NOT IN (
        SELECT Knows.PersonA 
        FROM Knows LEFT JOIN Likes
        ON Knows.PersonA = Likes.PersonA
        AND Knows.PersonB = Likes.PersonB
        WHERE Likes.PersonB is null
   )