如何创建UNION查询合并两表并返回物品最新盘点日期?
没问题,我来帮你搞定这个需求!首先咱们得先明确两张表的结构,假设两张表都包含物品标识(比如item_id)、物品名称(item_name)和盘点日期(stock_date)这几个核心字段——要是你的字段名不一样,直接替换成你实际的就行。
方案一:合并后分组取最新日期(适合只需要日期的场景)
这种方法先用UNION ALL把两张表的所有记录合并(用UNION ALL比UNION更高效,因为不会额外做去重;如果你的两张表有完全重复的记录,再换成UNION),然后按物品分组,取每个物品的最大盘点日期。
具体SQL代码如下:
SELECT item_id, item_name, MAX(stock_date) AS latest_stock_date FROM ( -- 合并两张表的核心数据 SELECT item_id, item_name, stock_date FROM inventory_table_a UNION ALL SELECT item_id, item_name, stock_date FROM inventory_table_b ) AS combined_inventory GROUP BY item_id, item_name;
逻辑说明:
- 子查询
combined_inventory通过UNION ALL把两张表的物品、日期数据合并成一个临时数据集; - 外层查询按物品的唯一标识(
item_id)和名称分组,用MAX(stock_date)直接拿到每个物品的最新盘点日期。
方案二:用窗口函数获取完整的最新记录(适合需要更多字段的场景)
如果你除了日期,还需要该最新盘点记录的其他信息(比如盘点数量、存放位置),用窗口函数ROW_NUMBER()会更灵活,能精准定位到每个物品的最新那条记录:
SELECT item_id, item_name, stock_date AS latest_stock_date, stock_quantity -- 示例:假设还有盘点数量字段,可替换成你需要的其他字段 FROM ( SELECT item_id, item_name, stock_date, stock_quantity, -- 按物品分组,按盘点日期倒序排序,最新的记录会被标记为1 ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY stock_date DESC) AS rn FROM ( SELECT item_id, item_name, stock_date, stock_quantity FROM inventory_table_a UNION ALL SELECT item_id, item_name, stock_date, stock_quantity FROM inventory_table_b ) AS combined_inventory ) AS ranked_inventory WHERE rn = 1;
逻辑说明:
- 最内层先合并两张表的所有相关字段;
- 中间层用
ROW_NUMBER()给每个物品的记录按日期从新到旧编号,最新的记录编号为1; - 外层筛选出编号为
1的记录,就能得到每个物品的完整最新盘点信息。
几个注意点
- 要是两张表的字段不完全一致,比如表A有
stock_location而表B没有,那在子查询里给表B的对应字段补NULL即可,比如SELECT item_id, item_name, stock_date, NULL AS stock_location FROM inventory_table_b; - 如果你的物品唯一标识只有
item_id,那GROUP BY或者PARTITION BY只需要item_id就行,不用带item_name; - 确保
stock_date是日期/时间类型,不然MAX()和排序逻辑会出错。
内容的提问来源于stack exchange,提问作者Alch
相关产品推荐
相关产品推荐

