0

我有这个查询:

SELECT B.id, B.name, D.id, D.name FROM TBB B, TDD D
WHERE (D.id = B.id OR D.id IS NULL)

从我的想法来看,(D.id = B.id OR D.id IS NULL)将显示在表 TBB 和 TDD 中都有 id 的记录,但也会显示所有B.id记录,即使两个表没有相同的 id 因为D.id IS NULL

那么,这是否与我上面的查询相同:

 SELECT B.id, B.name, D.id, D.name FROM TBB B, TDD D
    WHERE B.id = D.id (+)

提前致谢!

4

2 回答 2

1

第二个查询将返回 TBB 表中存在的所有行,TDD 表中不匹配的列将返回为 NULL。

如果 TDD 表有任何与 TBB 表 ID 不匹配的 ID,则上述两个查询不会返回该行。

于 2012-09-20T04:52:16.693 回答
0

我很确定您的顶级查询将导致 B 中的每条记录的笛卡尔连接,以获取由于or查询中的语句而具有 NULL 的记录。

基于此,您最好使用外部连接。

我还写了一篇冗长的问答,讨论了连接以及如何从您可能感兴趣的多个表中提取数据(SQL 查询如何从多个表中返回数据)它涵盖了联合、内连接和外连接以及子查询。它有大量的代码和输出结果,详细解释。(以至于我达到了答案长度限制,所以不得不发布第二个答案)

编辑:运行快速测试后,这是我想出的:

    mysql> select a.ID, a.Title, b.Name as Author
    from books a join authors b
    on a.authorID=b.ID or b.id=0;

    +----+----------------------+-------------------+
    | ID | Title                | Author            |
    +----+----------------------+-------------------+
    |  1 | Call of the Wild     | Fluffeh           |
    |  1 | Call of the Wild     | Jack London       |
    |  2 | Martin Eden          | Fluffeh           |
    |  2 | Martin Eden          | Jack London       |
    |  3 | Old Goriot           | Fluffeh           |
    |  3 | Old Goriot           | Honore de Balzac  |
    |  4 | Cousin Bette         | Fluffeh           |
    |  4 | Cousin Bette         | Honore de Balzac  |
    |  5 | Jew Suess            | Fluffeh           |
    |  5 | Jew Suess            | Lion Feuchtwanger |
    |  6 | Nana                 | Fluffeh           |
    |  6 | Nana                 | Emile Zola        |
    |  7 | The Belly of Paris   | Fluffeh           |
    |  7 | The Belly of Paris   | Emile Zola        |
    |  8 | In Cold blood        | Fluffeh           |
    |  8 | In Cold blood        | Truman Capote     |
    |  9 | Breakfast at Tiffany | Fluffeh           |
    |  9 | Breakfast at Tiffany | Truman Capote     |
    +----+----------------------+-------------------+
    18 rows in set (0.00 sec)

    mysql> select a.ID, a.Title, b.Name as Author
    from books a right outer join authors b
    on a.authorID=b.ID;
    +------+----------------------+-------------------+
    | ID   | Title                | Author            |
    +------+----------------------+-------------------+
    | NULL | NULL                 | Fluffeh           |
    |    1 | Call of the Wild     | Jack London       |
    |    2 | Martin Eden          | Jack London       |
    |    3 | Old Goriot           | Honore de Balzac  |
    |    4 | Cousin Bette         | Honore de Balzac  |
    |    5 | Jew Suess            | Lion Feuchtwanger |
    |    6 | Nana                 | Emile Zola        |
    |    7 | The Belly of Paris   | Emile Zola        |
    |    8 | In Cold blood        | Truman Capote     |
    |    9 | Breakfast at Tiffany | Truman Capote     |
    +------+----------------------+-------------------+
    10 rows in set (0.00 sec) 

这肯定与外部连接不同。正如我所想的那样(至少在 MySQL 中)第一个语句中的结果是笛卡尔,但不是在外部连接中。

于 2012-09-20T04:51:24.070 回答