【问题标题】:Difference between OR and UNION ALL in this case在这种情况下 OR 和 UNION ALL 之间的区别
【发布时间】:2016-07-10 00:18:01
【问题描述】:

我有 3 个实体或表:BOOKSCIENCEFICTIONSCIENCEFICTION 通过名为 ISBN 的外键连接到 BOOKBOOK 还包含另一个名为 AUTHOR 的字段。

我想选择所有书籍为科幻或小说的作者。如果两本书的作者相同,我应该保留这两个记录。

我想出了以下解决方案(显然不正确):

SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, FICTION, SCIENCE
WHERE BOOK.ISBN = FICTION.ISBN OR BOOK.ISBN = SCIENCE.ISBN;

但正确的应该是:

SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, FICTION
WHERE BOOK.ISBN = FICTION.ISBN
UNION ALL
SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, SCIENCE
WHERE BOOK.ISBN = SCIENCE.ISBN;

确实,它们会产生不同的结果。我的查询返回更多记录。我的查询有什么问题?我的查询和它下面的“正确”查询有什么区别?

【问题讨论】:

  • 笛卡尔积:en.wikipedia.org/wiki/Join_(SQL)#Cross_join -- 第一个查询是将所有表交叉连接在一起。
  • @ps2goat 但是为什么要这么做呢?
  • 我觉得这里的设计有点可疑。 FictionScience 实体应该是Book 实体的属性值,例如命名为Genre
  • 既是一个糟糕的问题,也是一个糟糕的解决方案。为什么要在一个结果集中多次列出作者?
  • @GordonLinoff 我认为练习的目的只是为了学习如何使用某些运算符或某些构造...

标签: mysql sql union-all or-operator


【解决方案1】:

在第一个查询中,如果 Book 的 ISBN 与 Fiction ISBN 匹配,则连接所有 Science 记录,反之亦然,如果 Science ISBN 匹配,则 all Fiction记录已加入。

【讨论】:

  • 但是为什么要这样做呢?如果满足这两个条件,我的查询不应该只表明返回所有图书的作者吗?
  • 我认为问题与我说的..FROM BOOK, FICTION, SCIENCE...有关,也就是说,我说的是3个实体,但通常我们只说2个,就像在解决方案中一样...你怎么看?
  • 条件满足 - 要么,要么。没有条件的联接称为“笛卡尔积”:具有 n 条记录的表与具有 m 条记录的表联接会产生 n * m 条记录。 WHERE 条件只是过滤结果集。在你的情况下,你得到 (n * m1 + n * m2) 记录
  • 但是我在哪里加入呢?
  • FROM table COMMA table 表示 FROM table [CROSS] JOIN table 其中 CROSS JOIN 是笛卡尔积
【解决方案2】:

查询没有错OR查询产生所有实例如果有相似的行联合选择只产生一个实例..

OR 查询返回关系结果..联合返回集合理论结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2021-10-28
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多