当前位置: 首页 > 知识库问答 >
问题:

左外侧连接不工作

闻枫
2023-03-14

早上好,

我正在进行SQL学习之旅,并试图创建一个带有一些查询的小型数据库以获得经验。使用的两个数据库,Person{id, name, age}和Knows{id,guest1_id→人员,guest2_id→人员}

查询应该会产生一个不认识数据库中任何人但可以被其他人知道的人的姓名列表。下面是我到目前为止得到的代码,但它似乎没有获得任何东西。

这里有什么问题?

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 )

非常感谢。

共有3个答案

萧成文
2023-03-14
WHERE K.id NOT IN (SELECT id FROM Knows)

where子句基本上排除了所有数据项,K.id必须在Knows的id中。

狄冥夜
2023-03-14

试试这个:

SELECT P.*
FROM Persons P 
LEFT JOIN Knows K ON K.guest1_id = P.id
WHERE K.id IS NULL

这将为您提供不认识任何人的人。

你也可以试试这个:

SELECT *
FROM Persons
WHERE NOT EXISTS(SELECT 1 FROM Knows WHERE guest1_id = P.id)
慕俊语
2023-03-14

你的问题真的没有意义,查询的外观也没有意义。但是,如果您查找的是所有不认识任何人的人,那么总的来说,这意味着该人既不在Knows表的guest1 ID列中,也不在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 

那么,person 2是唯一不认识任何其他人的人,因此他们的ID不在Knows表的Guest1或Guest2列中。

 类似资料:
  • LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F

  • MariaDB 用于返回条件中指定的左侧表中的所有行,并仅返回满足连接条件的其他表中的行。 也被称为。 语法: 图形表示如下: 注: 上图中,两个图形的左侧表(table1)和右侧表(table2)中间交叉蓝色部分,以及左侧表(table1)就是连接返回的结果集。 为了方便演示,我们需要创建两个表,并插入一些数据 - 插入数据 - 当前表中的行记录如下 - 当前表中的行记录如下 - 示例1 使用以

  • 问题内容: 我有一个Hibernate的服务方法,例如:。securityId2由用户传递。每个SecurityContact与一个Contact有多对一的关系,因此Hibernate在运行此查询时会自动调用联接。但是,Hibernate始终运行的联接是内部联接,因此无法正常运行。有没有办法强迫Hibernate在内部生成左外部联接?这是SecurityContact类的代码: 问题答案: 尝试多

  • 我正在尝试使用Criteria API获取以下查询: 我做到了: 尝试添加 实体看起来像 和 尝试以不同的方式使用联接,但看起来我缺少了一些东西。我得到了orderBy,谓词都是正确的。我正在使用JPA 2.1和Oracle。

  • 我在使用LEFT JOIN FETCH时遇到了一个问题。请参考我下面的实体和存储库。 考虑一个场景,可选的课程不会在任何时间点从表中删除。但是学生信息可以被删除。数据库中的两个表之间没有主键和外键关系。只是我们有一个共同的栏目“学生ID”。 不带事务的服务方法: 具有事务性的服务方法: 尽管我使用了LEFT JOIN FETCH,但当我调用依赖实体(即oc)时,为什么在学生记录不存在的情况下(即学