我有一个小型数据库:表格发票包含每笔销售的发票,表格详细信息包含每笔销售的明细行,每张发票应该有一个或多个详细信息专栏:
在上一张图片中,表发票包含3个销售,其中ID为 1 , 2 和 3 。表详细信息仅包含发票 1 和 3 的明细行,因为有人意外删除了发票 2 的明细行。
现在,我必须创建一个显示所有发票及其故障单类型的报告。我尝试了下一个查询,但发票 2 缺失,因为它没有详细信息行:
SELECT invoices.id,
detail.ticket_type
FROM invoices
JOIN detail
ON detail.invoice = invoices.id
结果是:
id ticket_type
───────────────────────────
1 adult
1 child
3 hot dog
我尝试过具有相同结果的变体,例如:
SELECT invoices.id,
detail.ticket_type
FROM detail
JOIN ( SELECT id
FROM invoices
) AS invoices
ON detail.invoice = invoices.id
所以,我的问题是:当某些发票没有明细行时,如何才能获得所有发票的ID及其票据类型?在这些情况下, ticket_type 列必须保持空白。
答案 0 :(得分:2)
使用LEFT JOIN
:
SELECT invoices.id,
coalesce(detail.ticket_type, '') ticket_type
FROM invoices
LEFT JOIN detail
ON detail.invoice = invoices.id
请注意已交换的invoices
和detail
。使用您希望FROM
子句中所有行的表,使用LEFT JOIN
添加详细信息。