【问题标题】:A self join query自联接查询
【发布时间】:2020-10-08 03:42:05
【问题描述】:

鉴于此关系模式

  • 人员(pid、姓名、性别、年龄、电子邮件、城市、州)
  • 图书(ISBN、书名、版本、出版商、年份、评级)
  • write (pid, ISBN) pid 是外键,指的是人 (pid),ISBN 是外键,指的是书籍 (ISBN)

我需要编写一个 SQL 查询来查找从未出版过合着书籍或仅与同一州的其他人合着的作者,返回他们的姓名。

我知道我需要使用自联接,但不知道该怎么做。

谢谢!

【问题讨论】:

    标签: sql


    【解决方案1】:

    我认为蒂姆的推理是正确的,但查询不是。它需要在writes 上自加入:

    select p.*
    from people p
    where not exists (select 1
                      from writes w join
                           writes w2
                           on w.isbn = w2.isbn join
                           people p2
                           on w2.pid = w.pid
                      where w.pid = p.pid and
                            p.state <> p2.state
                     );
    

    【讨论】:

      【解决方案2】:

      您的两个逻辑标准实际上可以浓缩为您只希望与来自不同州的其他人没有合着书籍的作者。因此,我们可以为此编写一个查询:

      SELECT p1.name
      FROM people p1
      WHERE NOT EXISTS (SELECT 1 FROM write w INNER JOIN people p2 ON p2.pid = w.pid
                        WHERE w.pid = p1.pid AND p2.state <> p1.state);
      

      【讨论】:

      • 我觉得书也应该收录
      • 为什么?您的逻辑实际上不涉及任何书籍字段。相反,我们只需要知道这样的ISBN 存在并且与某个作者相关联。
      • 正确,但您的回答中没有包含 ISBN。
      • 你说:return their names ...你没有提到任何其他领域。如果您需要其他字段,那么您应该提及这一点。
      • 但是共同作者是什么意思?我猜他们必须共享同一个 ISBN。
      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2018-08-21
      • 2020-07-28
      相关资源
      最近更新 更多