1

在尝试学习 sql 时,我遇到了“Learn SQL The Hard Way”并开始阅读它。一切都很顺利,然后我想,作为一种练习方式,做一些像书中给出的例子(例子包括 3 个表 pet、person、person_pet 和 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 回答