You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写T-SQL查询,基于两表关联生成两个符合条件的输出表?

解决你的T-SQL双结果集需求

我明白你想要实现的逻辑:把F1和F2通过ITEM_NO关联后,分成两个结果集——一个是有符合日期范围的匹配记录,另一个是匹配但完全没有符合日期的记录,而且如果某个物料已经有至少一条符合日期的记录,其他不符合的就直接丢弃,不会出现在任何结果集里对吧?

下面是具体的实现方案,我会一步步解释清楚:

核心思路

首先我们得先标记出哪些物料在F2里存在至少一条MVT_DATE落在SDATE和EDATE之间的记录,然后基于这个标记来划分两个结果集:

  1. OUTPUT1:只保留关联后MVT_DATE在目标区间内的记录(只要有符合的,其他不符合的直接忽略)
  2. 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);

代码解释

  1. ValidItemNos CTE:这个公共表表达式会提取出所有在F2中有至少一条符合日期条件的物料编号,相当于给我们一个“合格物料清单”。
  2. OUTPUT1的生成:直接关联F1和F2,筛选出F2中日期在区间内的记录,完全符合你要的“只保留符合日期的匹配记录”需求——比如你说的物料67890,只有那条日期达标的记录会被放进OUTPUT1,另外两条直接被过滤掉。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:41:38