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

2 番目のクエリは、TBB テーブルに存在するすべての行を返します。TDD テーブルの一致しない列は NULL として返されます。

TDD テーブルに TBB テーブル ID と一致しない ID がある場合、その行は上記の 2 つのクエリでは返されません。

于 2012-09-20T04:52:16.693 に答える
0

orあなたの一番上のクエリは、クエリのステートメントのために NULL を持つレコードの B のすべてのレコードへのデカルト結合になると確信しています。

それに基づいて、外部結合を使用する方がよいでしょう。

また、結合と、関心のある複数のテーブルからデータをプルする方法 ( SQL クエリが複数のテーブルからデータを返す方法) を見る長い Q&A も書きました。詳細に説明されているコードと出力結果がたくさんあります(回答の長さの制限に達したので、2番目の回答を投稿する必要がありました)

編集:簡単なテストを実行した後、これが私が思いついたものです:

    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 に答える