如何编写T-SQL查询,基于两表关联生成两个符合条件的输出表?
解决你的T-SQL双结果集需求
我明白你想要实现的逻辑:把F1和F2通过ITEM_NO关联后,分成两个结果集——一个是有符合日期范围的匹配记录,另一个是匹配但完全没有符合日期的记录,而且如果某个物料已经有至少一条符合日期的记录,其他不符合的就直接丢弃,不会出现在任何结果集里对吧?
下面是具体的实现方案,我会一步步解释清楚:
核心思路
首先我们得先标记出哪些物料在F2里存在至少一条MVT_DATE落在SDATE和EDATE之间的记录,然后基于这个标记来划分两个结果集:
- OUTPUT1:只保留关联后
MVT_DATE在目标区间内的记录(只要有符合的,其他不符合的直接忽略) - OUTPUT2:只保留那些物料在F2里没有任何符合日期的记录,也就是关联后所有
MVT_DATE都不在区间内的记录
完整T-SQL代码
-- 先定义日期范围变量(你可以根据实际情况替换成具体值或参数) DECLARE @SDATE DATE = '2023-01-01'; DECLARE @EDATE DATE = '2023-12-31'; -- 第一步:找出所有有符合日期记录的物料编号 WITH ValidItemNos AS ( SELECT DISTINCT ITEM_NO FROM F2 WHERE MVT_DATE BETWEEN @SDATE AND @EDATE ) -- 生成OUTPUT1:ITEM_NO匹配且日期在范围内的记录 SELECT f1.*, f2.* INTO OUTPUT1 FROM F1 f1 INNER JOIN F2 f2 ON f1.ITEM_NO = f2.ITEM_NO WHERE f2.MVT_DATE BETWEEN @SDATE AND @EDATE; -- 生成OUTPUT2:ITEM_NO匹配但没有任何符合日期的记录 SELECT f1.*, f2.* INTO OUTPUT2 FROM F1 f1 INNER JOIN F2 f2 ON f1.ITEM_NO = f2.ITEM_NO WHERE f1.ITEM_NO NOT IN (SELECT ITEM_NO FROM ValidItemNos);
代码解释
- ValidItemNos CTE:这个公共表表达式会提取出所有在F2中有至少一条符合日期条件的物料编号,相当于给我们一个“合格物料清单”。
- OUTPUT1的生成:直接关联F1和F2,筛选出F2中日期在区间内的记录,完全符合你要的“只保留符合日期的匹配记录”需求——比如你说的物料67890,只有那条日期达标的记录会被放进OUTPUT1,另外两条直接被过滤掉。
- OUTPUT2的生成:关联F1和F2后,只保留那些不在“合格物料清单”里的记录,也就是这些物料在F2里的所有匹配记录都不符合日期条件,所以全部归入OUTPUT2。
额外说明
如果你希望OUTPUT2只保留F1的基础信息(不需要F2的详细记录),可以把OUTPUT2的查询改成这样:
SELECT f1.* INTO OUTPUT2 FROM F1 f1 WHERE EXISTS ( SELECT 1 FROM F2 f2 WHERE f1.ITEM_NO = f2.ITEM_NO ) AND f1.ITEM_NO NOT IN (SELECT ITEM_NO FROM ValidItemNos);
内容的提问来源于stack exchange,提问作者user3537446
相关产品推荐
相关产品推荐

