【发布时间】:2016-07-10 00:18:01
【问题描述】:
我有 3 个实体或表:BOOK、SCIENCE 和 FICTION。 SCIENCE 和 FICTION 通过名为 ISBN 的外键连接到 BOOK。 BOOK 还包含另一个名为 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 但是为什么要这么做呢?
-
我觉得这里的设计有点可疑。
Fiction和Science实体应该是Book实体的属性值,例如命名为Genre。 -
既是一个糟糕的问题,也是一个糟糕的解决方案。为什么要在一个结果集中多次列出作者?
-
@GordonLinoff 我认为练习的目的只是为了学习如何使用某些运算符或某些构造...
标签: mysql sql union-all or-operator