SQL:从谓词逻辑到SQL SELECT
SQL: from predicate logic to SQL SELECT
我正在尝试了解如何有效地将谓词逻辑转换为 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)))
用作'formulas':
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 table 不是对称的,只包含 Person table 的外键,因此表示 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))
查找认识但不喜欢的人的列表。然后 select 来自不在那个集合中的人。
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
)
我正在尝试了解如何有效地将谓词逻辑转换为 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)))
用作'formulas':
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 table 不是对称的,只包含 Person table 的外键,因此表示 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))
查找认识但不喜欢的人的列表。然后 select 来自不在那个集合中的人。
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
)