基于两列(含非唯一列)关联两张表的SQL查询需求
解决方案:关联两张表查询订单全量数据
嘿,我来帮你搞定这个SQL查询的写法~ 首先得先明确几个关键点,再一步步写出符合需求的查询语句:
1. 先明确表结构与关联逻辑
假设我们给两张表起个直观的别名(你可以替换成实际项目里的表名):
- 物品信息表:
item_info,字段包括order_number(订单号)、id_number(ID号)、lot_number(批号) - 数量跟踪表:
quantity_tracking,字段包括quantity_ready(库存可用量)、quantity_ordered(客户订购量)、quantity_shipped(已发货量),以及和物品表关联的字段(比如id_number或lot_number,你提到其中一列非唯一,这列就是我们的关联键)
2. 选择合适的连接类型
根据你要返回的结果范围,选对应的JOIN:
- LEFT JOIN:如果要保留所有订单的物品信息,哪怕数量跟踪表中没有匹配的记录(此时数量字段会显示
NULL),用这个最稳妥。 - INNER JOIN:只需要同时存在物品信息和数量记录的订单,就用这个。
3. 基础查询示例
左连接(保留所有订单)
SELECT ii.order_number, ii.id_number, ii.lot_number, qt.quantity_ready, qt.quantity_ordered, qt.quantity_shipped FROM item_info ii LEFT JOIN quantity_tracking qt ON ii.id_number = qt.id_number;
这里用ii和qt作为表别名,让代码更简洁。ON子句里的id_number就是我们的非唯一关联键——如果实际业务是用lot_number关联,把这里改成ii.lot_number = qt.lot_number就行。
内连接(仅取两边都匹配的记录)
把上面的LEFT JOIN换成INNER JOIN即可:
SELECT ii.order_number, ii.id_number, ii.lot_number, qt.quantity_ready, qt.quantity_ordered, qt.quantity_shipped FROM item_info ii INNER JOIN quantity_tracking qt ON ii.id_number = qt.id_number;
4. 处理非唯一关联的重复行问题
因为关联列是非唯一的,很可能出现一对多的匹配(比如一个ID对应多个数量记录),导致查询结果出现重复的订单行。如果需要汇总数量,可以用GROUP BY结合聚合函数:
SELECT ii.order_number, ii.id_number, ii.lot_number, SUM(qt.quantity_ready) AS total_ready, SUM(qt.quantity_ordered) AS total_ordered, SUM(qt.quantity_shipped) AS total_shipped FROM item_info ii LEFT JOIN quantity_tracking qt ON ii.id_number = qt.id_number GROUP BY ii.order_number, ii.id_number, ii.lot_number;
这个查询会把同一个订单下的所有数量记录汇总成一行,避免重复。
内容的提问来源于stack exchange,提问作者Yuropoor
相关产品推荐
相关产品推荐

