1

SQLを学ぼうとしているときに、「Learn SQL The Hard Way」に出くわし、読み始めました。すべてが順調に進んでいたので、練習の方法として、本にある例のようなものを作成することを考えました (例は、pet、person、person_pet の 3 つのテーブルで構成され、person_pet テーブルはペットを所有者に「リンク」します)。

私はこれを作りました:

report table
+----+-------------+
| id | content     |
+----+-------------+
|  1 | bank robbery|
|  2 | invalid     |
|  3 | cat on tree |
+----+-------------+
notes table
+-----------+--------------------+
| report_id | content            |
+-----------+--------------------+
|  1        | they had guns      |
|  3        | cat was saved      |
+-----------+--------------------+

wanted result
+-----------+--------------------+---------------+
| report_id | report_content     | report_notes  |
+-----------+--------------------+---------------+
|  1        | bank robbery       | they had guns |
|  2        | invalid            | null or ''    |
|  3        | cat on tree        | cat was saved |
+-----------+--------------------+---------------+

いくつかの組み合わせを試しましたが、成功しませんでした。

私の最初の考えは

SELECT report.id,report.content AS report_content,note.content AS note_content
FROM report,note
WHERE report.id = note.report_id

ただし、これは一致するもののみを返します (無効なレポートは返されません)。この後、IF条件を追加しようとしましたが、悪化しました。

私の質問は、これは基本的なSQLを通過した後に理解するものですか、それとも簡単な方法で行うことができますか?

とにかく、助けていただければ幸いです。これでほとんど負けました。

ありがとうございました。

編集:関連する質問を調べましたが、私の問題を解決する質問はまだ見つかりません。これを整理するには、おそらく join などの他のステートメントを調べる必要があります。

4

2 に答える 2

5

の章に進む必要がありますOUTER JOINS。具体的には、LEFT JOIN

SELECT report.id,report.content AS report_content,note.content AS note_content 
FROM report
    LEFT JOIN note ON report.id = note.report_id 

を使用するのではなく、ANSI-92 JOIN 構文に注意してください。WHERE x=y

WHERE report.id *= note.report_id(古い構文を正しく思い出せば、おそらく使用していた古い構文を使用して実行できますが、代わりに上記の構文をお勧めします)

于 2012-09-02T21:36:18.173 に答える
2

結合を行っています。あなたが持っている結合の種類は内部結合ですが、外部結合が必要です:

SELECT report.id,report.content AS report_content,note.content AS note_content
FROM report
LEFT JOIN note on report.id = note.report_id

LEFT テーブルは、欠損値を提供するテーブルであることに注意してください。

于 2012-09-02T21:39:06.837 に答える