SQL多表关联查询:如何获取propals、orders、invoices全量数据
正确SQL实现方案
你的原查询仅从propals表出发做左连接,因此只能获取与报价单关联的记录,无法覆盖无关联的订单、发票以及无关联订单的发票。要实现需求,需要通过UNION ALL合并三类场景的查询结果:
- 所有报价单(propals)及其关联的订单、发票
- 未关联任何报价单的订单及其关联的发票
- 未关联任何订单的发票
完整SQL语句如下:
-- 第一部分:所有报价单及其关联的订单、发票 SELECT p.ref AS propal, o.ref AS `order`, i.ref AS invoice FROM propals p LEFT JOIN element_element ee1 ON ee1.sourcetype = 'propal' AND ee1.fk_source = p.id LEFT JOIN orders o ON o.id = ee1.fk_target LEFT JOIN element_element ee2 ON ee2.sourcetype = 'order' AND ee2.fk_source = o.id AND ee2.targettype = 'invoice' LEFT JOIN invoices i ON i.id = ee2.fk_target UNION ALL -- 第二部分:未关联报价单的订单及其关联的发票 SELECT NULL AS propal, o.ref AS `order`, i.ref AS invoice FROM orders o LEFT JOIN element_element ee_propal ON ee_propal.targettype = 'order' AND ee_propal.fk_target = o.id AND ee_propal.sourcetype = 'propal' LEFT JOIN element_element ee_invoice ON ee_invoice.sourcetype = 'order' AND ee_invoice.fk_source = o.id AND ee_invoice.targettype = 'invoice' LEFT JOIN invoices i ON i.id = ee_invoice.fk_target WHERE ee_propal.fk_source IS NULL UNION ALL -- 第三部分:未关联任何订单的发票 SELECT NULL AS propal, NULL AS `order`, i.ref AS invoice FROM invoices i LEFT JOIN element_element ee ON ee.targettype = 'invoice' AND ee.fk_target = i.id AND ee.sourcetype = 'order' WHERE ee.fk_source IS NULL
说明:
- 第一部分通过左连接完整保留所有报价单,同时关联其对应的订单和发票,无关联时显示
NULL - 第二部分筛选出未被任何报价单关联的订单,再关联其对应的发票
- 第三部分筛选出未被任何订单关联的发票,单独返回
UNION ALL用于合并结果,避免自动去重导致的有效记录丢失(若需去重可替换为UNION,但此场景下不会产生重复)
内容的提问来源于stack exchange,提问作者UltraViolet33
相关产品推荐
相关产品推荐

