Oracle SQL连接查询:如何同时获取指定客户全部交易记录与指定交易采购明细及查询语句修正
解决你的SQL查询问题
嘿,我清楚你的问题出在哪了!你当前的查询之所以只能返回交易编号5和6的记录,是因为两个关键问题:
- 你把
t.trans_num IN (5,6)这个采购明细的过滤条件放在了全局WHERE里,直接过滤掉了客户的其他交易 - 用
INNER JOIN关联purchases表,进一步要求所有返回的交易必须有对应的采购记录,相当于又加了一层过滤
要同时满足你的三个需求——拿到指定客户记录、该客户全部交易、以及交易5和6的采购明细,你只需要调整关联方式和条件位置就行:
修改后的查询语句
SELECT c.*, t.*, p.* FROM customers c INNER JOIN transactions t ON c.custid = t.custid LEFT JOIN purchases p ON t.transid = p.transid AND t.trans_num IN (5,6) WHERE c.customer = 1234 ORDER BY t.trans_num;
关键调整说明
- 用
INNER JOIN关联transactions表:确保能拿到该客户的全部交易记录,不会被采购表的条件过滤 - 把采购明细的过滤条件移到
LEFT JOIN的ON子句中:只有交易编号5和6的记录会关联对应的采购明细,其他交易的采购字段会显示为NULL,但交易本身不会被剔除 - 全局
WHERE仅保留客户过滤条件:保证返回的都是指定客户的相关数据
如果之后你想把采购明细和交易记录分开展示,也可以考虑用两个独立的查询(一个查客户+全部交易,另一个查交易5、6的采购明细),不过上面的写法应该能满足你一次性获取三类数据的需求。
内容的提问来源于stack exchange,提问作者k4tz3n-j4mm3r




