在尝试学习sql的过程中遇到了“学习SQL困难之路”,我开始阅读它。 一切都很好,然后我想,作为练习的方式,在书中做出类似给定的例子(例子包括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或者其他东西来解决这个问题。答案 0 :(得分: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
的旧语法来实现它,如果我正确地回忆旧语法,但我建议使用上面的语法)
答案 1 :(得分: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表是提供缺失值的表。