LEFT OUTER JOIN不起作用

时间:2015-03-03 16:06:22

标签: sql left-join notin

早上好,

我正在进行SQL学习之旅并尝试使用一些查询创建一个小型数据库以获得经验。 使用的两个数据库,人员{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 )

谢谢!

4 个答案:

答案 0 :(得分:1)

您的问题确实没有意义,查询的外观也没有。但是,如果您正在寻找所有不认识任何人的人,那么总的来说,这个人既不在Knows表中的guest1或guest2 ID列中。

如果是这种情况,你可以对知道表进行双左连接,然后只选择那些不适合任何一方的

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

所以,如果你的表

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表的Guest1 OR Guest2列中。

答案 1 :(得分:0)

WHERE K.id NOT IN (SELECT id FROM Knows)

此where子句基本上排除了所有数据条目,K.id必须位于Knows的ID中。

答案 2 :(得分:0)

你的where子句中的条件有点傻:

...  K.id NOT IN (SELECT id
                 FROM Knows)

K是Knows的别名,所以基本上这说:“只选择不存在的行”。

此外,此条件不适用于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)

此查询说:“选择guest1字段中未引用的所有人和/或'知道'的guest2字段。

您也可以使用LEFT JOIN和where子句中的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

答案 3 :(得分:0)

试试这个:

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)