SQL SERVER多表多条件匹配查询
A表:工单记录表,order_id无重复
B表:记录工单的发料日期,工单记录表中的order_id可能未出现在此表(未发料)或者出现多条记录(有不同的日期在发料)
期望实现的查询结果:列出A表qty_finished<qty_order或qty_finished为NULL的所有字段(所有未完成的工单),并在B表中查询最早的workdate(哪一天开始生产?),并计算到当天的天数(已经生产了几天)
具体见下图:
建議把 create table 和 insert 放上來,讓其他人可以更容易的 測試 / 提供意見。
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题可以通过使用SQL的联接和聚合函数来解决。下面是一个解决方案的例子:
SELECT A.order_id, A.qty_order, A.qty_finished, DATEDIFF(day, B.min_workdate, GETDATE()) AS days_in_production
FROM A
LEFT JOIN (
SELECT order_id, MIN(workdate) AS min_workdate
FROM B
GROUP BY order_id
) AS B
ON A.order_id = B.order_id
WHERE A.qty_finished < A.qty_order OR A.qty_finished IS NULL
首先,我们使用左联接将A表和B表连接起来,通过order_id将两个表关联起来。
然后,我们使用子查询来从B表中找到每个工单的最早的工作日期。
接下来,我们使用DATEDIFF函数来计算从最早的工作日期到当前日期的天数。
最后,我们使用WHERE子句过滤出符合条件的记录,即A表中qty_finished小于qty_order或qty_finished为NULL的记录。
这个查询将返回A表中所有未完成的工单,并且还包括每个工单从开始生产到当前日期的天数。
为了优化这个查询,首先我们可以为A表的qty_finished和qty_order两个字段创建索引,这样在过滤数据时可以更快地定位到符合条件的记录。
另外,我们可以为B表的order_id和workdate字段创建联合索引,这样在查找每个工单的最早工作日期时可以更快地进行聚合操作。
但是需要注意的是,优化查询还需要根据实际的数据量和数据分布情况来进行调整和测试,以找到最合适的优化方案。