Sql 获取在另一个表的某个部分中不存在的行

Sql 获取在另一个表的某个部分中不存在的行,sql,sql-server-2005,Sql,Sql Server 2005,表1中的数据如下所示: DateMonthID SubscriberID othercolumns... 201201 106 201201 207 201202 309 201203 405 201203 297 等等等等 如表2所示: DateMonthID SubscriberID Level

表1中的数据如下所示:

  DateMonthID    SubscriberID    othercolumns...
     201201           106
     201201           207
     201202           309
     201203           405
     201203           297
等等等等

如表2所示:

  DateMonthID    SubscriberID    Level
       ...           ...          1
       ...           ...          2
       ...           ...          1
       ...           ...          3
       ...           ...          2
等等等等

我需要做的是检查第一个表中的哪些订户在未来3个月内不存在于另一个表中。这有意义吗

示例:以表中的subscriberID 106为例,日期为2011年1月。如果在201201-2012041年1月-4月期间未出现在其他表格中,我需要累计计数

这是我到目前为止所拥有的,但它似乎返回了太多的值:

SELECT
    COUNT(1) AS Total,
    table1.month_key,
    table2.level
FROM
    dbo.table1
INNER JOIN
    dbo.table2 ON (table2.subscriber_id = table1.subscriber_id)
WHERE
    NOT EXISTS (SELECT * FROM table2
                WHERE
                (table2.month_key >= table1.month_key AND table2.month_key <= (table1.month_key + 3))
                AND table2.subscriber_id = table1.subscriber_id)
GROUP BY
table1.month_key, table2.level
ORDER BY
table2.level, table1.month_key
任何帮助都将不胜感激

-------编辑-------
只是为了让事情更清楚,因为我不确定我是否解释得很好。情况是,在表1中是停止订阅的人的行以及他们停止订阅的日期。问题是这可能不是真的,也许他们只是改变了订阅或一个月后重新订阅。表2列出了每个月的订户。我需要通过检查他们是否在表1所示的退订日期和接下来的3个月之间出现在表2中,来找出谁真正退订了。希望这能有所帮助。

我认为问题在于你不能在月份键上加上3来获得你想要的。请尝试以下方法:

FROM (select table1.*,
             (cast(left(month_key, 4) as int)*12+
                                cast(right(month_key, 2) as int)
                               ) as newMonthKey
      from dbo.table1
     ) table1
. . .

where not exists (select 1
                  from (select table2.*,
                               (cast(left(month_key, 4) as int)*12+
                                cast(right(month_key, 2) as int)
                               ) as newMonthKey
                        from table2
                       ) t
                  where (t.newmonthkey >= table1.newmonthkey AND t.newmonthkey <= (table1.newmonthkey + 3))
                        AND t2.subscriber_id = table1.subscriber_id
                       )

这将从0年起将monthkey更改为月份计数器。

什么是月份键?这是六位数的DateMonthID,还是其他什么?那么,您的输出需要是什么样的?输出需要是Total,MonthID,Level。因此,每个级别的每个月的总数在表1中显示了每个月的订户数量,而在表2中,在接下来的3个月中,订户数量不存在。因此,它当前返回的值在表2中,在接下来的3个月中确实存在?啊,您是正确的,您还帮助我注意到了另一个潜在问题,即我的表2数据只有2012年的数据,这意味着10月至11月,尤其是12月的订阅者比表2中的要少。所以本质上我需要做的就是添加一个和表1.month_key我很抱歉我很快就和你谈过了,问题是随着月份的推移,总数越来越大,以至于在结果中,到第二个月时,给定月份的所有总数都高于表1中该月的订户数。@Weebl。也许你的外部连接需要在monthid上连接以及用户id。我没有外部连接…我需要外部连接吗?我对SQL还是相当陌生,虽然我知道哪些连接是我不太熟悉的,但我不知道什么时候使用哪个连接。