LEFT OUTER JOIN 不起作用
LEFT OUTER JOIN does not work
早上好,
我正在进行 SQL 学习之旅,并尝试创建一个包含一些查询的小型数据库以获取经验。
使用了两个数据库,Person {id, name, age} 和 Knows {id, guest1_id → Persons, guest2_id → Persons}
查询结果应该是一个人名列表,这些人不认识数据库中的任何人,但其他人可能知道。以下是我目前得到的代码,但它似乎没有获得任何东西。
这里有什么问题?
SELECT distinct K.id
FROM Persons P
LEFT JOIN Knows K
ON K.guest1_id = P.id
AND K.guest2_id = P.id
WHERE K.id NOT IN (
SELECT id
FROM Knows )
谢谢!
WHERE K.id NOT IN (SELECT id FROM Knows)
这个where子句基本上排除了所有数据条目,K.id必须在Knows的ids中。
您的问题没有任何意义,查询的外观也没有意义。但是,如果您正在寻找所有不认识任何人的人,那么总而言之,这意味着此人既不在 Knows table.
中的 guest1 或 guest2 ID 列中
如果是这种情况,您可以对知识进行双左连接 table,只获取那些不适合任何一方的知识
SELECT
P.*
from
Persons P
LEFT JOIN Knows K1
on P.id = K1.guest1
LEFT JOIN Knows K2
on P.id = K2.guest2
where
K1.guest1 IS NULL
AND K2.guest2 IS NULL
因此,如果您的 table 个
Persons
ID Name
1 A
2 B
3 C
4 D
and Knows table
ID Guest1 Guest2
1 1 3
2 1 4
3 3 4
那么人 2 是唯一不认识任何其他人的人,因此他们的 ID 不在 Knows table.
的 Guest1 或 Guest2 列中
你的 where 子句中的条件有点傻:
... K.id NOT IN (SELECT id
FROM Knows)
K 是 Knows 的别名,所以基本上是这样说的:"Only select rows that don't exist"。
此外,此条件不适用于 NULL
值。我认为你试图做的实际上是这样的:
SELECT P.id
FROM Persons P
WHERE NOT EXISTS(
SELECT * FROM Knows K WHERE
K.guest1_id = P.id OR
K.guest2_id = P.id)
此查询表示:“Select 所有未在 guest1 字段 and/or guest2 字段 'Knows' 中提及的人。
您也可以在 where 子句中使用 LEFT JOIN 和 K.id IS NULL
来编写此代码。这更接近您的尝试,但在语义上不太准确,因此在我看来不是首选。
SELECT distinct K.id
FROM Persons P
LEFT JOIN Knows K ON K.guest1_id = P.id OR K.guest2_id = P.id
WHERE K.id IS NULL
试试这个:
SELECT P.*
FROM Persons P
LEFT JOIN Knows K ON K.guest1_id = P.id
WHERE K.id IS NULL
这会给你Persons
一个不认识的人。
你也可以试试这个:
SELECT *
FROM Persons
WHERE NOT EXISTS(SELECT 1 FROM Knows WHERE guest1_id = P.id)
早上好,
我正在进行 SQL 学习之旅,并尝试创建一个包含一些查询的小型数据库以获取经验。 使用了两个数据库,Person {id, name, age} 和 Knows {id, guest1_id → Persons, guest2_id → Persons}
查询结果应该是一个人名列表,这些人不认识数据库中的任何人,但其他人可能知道。以下是我目前得到的代码,但它似乎没有获得任何东西。
这里有什么问题?
SELECT distinct K.id
FROM Persons P
LEFT JOIN Knows K
ON K.guest1_id = P.id
AND K.guest2_id = P.id
WHERE K.id NOT IN (
SELECT id
FROM Knows )
谢谢!
WHERE K.id NOT IN (SELECT id FROM Knows)
这个where子句基本上排除了所有数据条目,K.id必须在Knows的ids中。
您的问题没有任何意义,查询的外观也没有意义。但是,如果您正在寻找所有不认识任何人的人,那么总而言之,这意味着此人既不在 Knows table.
中的 guest1 或 guest2 ID 列中如果是这种情况,您可以对知识进行双左连接 table,只获取那些不适合任何一方的知识
SELECT
P.*
from
Persons P
LEFT JOIN Knows K1
on P.id = K1.guest1
LEFT JOIN Knows K2
on P.id = K2.guest2
where
K1.guest1 IS NULL
AND K2.guest2 IS NULL
因此,如果您的 table 个
Persons
ID Name
1 A
2 B
3 C
4 D
and Knows table
ID Guest1 Guest2
1 1 3
2 1 4
3 3 4
那么人 2 是唯一不认识任何其他人的人,因此他们的 ID 不在 Knows table.
的 Guest1 或 Guest2 列中你的 where 子句中的条件有点傻:
... K.id NOT IN (SELECT id
FROM Knows)
K 是 Knows 的别名,所以基本上是这样说的:"Only select rows that don't exist"。
此外,此条件不适用于 NULL
值。我认为你试图做的实际上是这样的:
SELECT P.id
FROM Persons P
WHERE NOT EXISTS(
SELECT * FROM Knows K WHERE
K.guest1_id = P.id OR
K.guest2_id = P.id)
此查询表示:“Select 所有未在 guest1 字段 and/or guest2 字段 'Knows' 中提及的人。
您也可以在 where 子句中使用 LEFT JOIN 和 K.id IS NULL
来编写此代码。这更接近您的尝试,但在语义上不太准确,因此在我看来不是首选。
SELECT distinct K.id
FROM Persons P
LEFT JOIN Knows K ON K.guest1_id = P.id OR K.guest2_id = P.id
WHERE K.id IS NULL
试试这个:
SELECT P.*
FROM Persons P
LEFT JOIN Knows K ON K.guest1_id = P.id
WHERE K.id IS NULL
这会给你Persons
一个不认识的人。
你也可以试试这个:
SELECT *
FROM Persons
WHERE NOT EXISTS(SELECT 1 FROM Knows WHERE guest1_id = P.id)