You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL多表关联查询:如何获取propals、orders、invoices全量数据

正确SQL实现方案

你的原查询仅从propals表出发做左连接,因此只能获取与报价单关联的记录,无法覆盖无关联的订单、发票以及无关联订单的发票。要实现需求,需要通过UNION ALL合并三类场景的查询结果:

  1. 所有报价单(propals)及其关联的订单、发票
  2. 未关联任何报价单的订单及其关联的发票
  3. 未关联任何订单的发票

完整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:47:34