2017-05-12 162 views
0

我有两个表相互关联[t1] & [t2]有两列:[id] & [日期]。我希望从[t1](其中没有[t2]。[日期]或MIN([t1]。[日期])之前一年)检索[id]和[日期]。日期范围不在两个日期从另一个表

基本上排除[t2]。[日期](任何日期发生 - 动态)'或最早[t1]。[日期]之前一年的[id] s。在MIN([t1]。[日期])一年之前的任何[t2]。[id] s都可以,并且MIN([t1]。[日期])之后的任何[t2]。[id]好。如果任何[t2]。[日期]值落在一年范围内,则应将[id]从返回的数据中排除。

概念我想是这样的:

SELECT [id] 
FROM [t1] 
WHERE [t2].[date] NOT BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date] 

但我与如何处理这个挣扎;使用JOIN/UNION,DECLARE变量,WHERE子句。任何帮助,将不胜感激!谢谢!

/* Adding this new information below: */ 

我喜欢斯科特的回应;然而,我认为我原来并不认为我的“概念代码”足够一致。我想我正在寻找更像这样的东西,但我返回一个错误(聚合可能不会出现在WHERE子句中,除非它位于包含在HAVING子句或选择列表中的子查询中,并且聚合的列是一个外部参考。):

SELECT [id] 
FROM [t1] 
WHERE NOT EXISTS 
    (SELECT * FROM [t2] WHERE [t2].[date] 
    BETWEEN DATEADD(YEAR, -1, MIN([t1].[date])) AND MIN([t1].[date])) 

/* Adding this new information below: */ 

我相信我已经找到了原始查询的解决方案。如果你喜欢它,请给出'向上箭头'!

SELECT DISTINCT [t1].[id] 
FROM [t1] 
WHERE NOT EXISTS (SELECT 1 
        FROM [t2] 
        WHERE [t2].[id] = [t1].[id] 
        AND [t2].[date] BETWEEN DATEADD(dd, -365, [t1].[date]) 
              AND [t1].[date]) 
+0

我只想离开这个位置... HTTP://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do -between-and-the-devil-have-in-common.aspx –

回答

1

WHERE日期<起始日期或日期>结束日期

3

这是一个工作不存在!

SELECT [id] 
FROM [t1] 
WHERE NOT EXISTS (SELECT * FROM [t2] 
        WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date]) 

更新来比较敏(T1.Date):

我不熟悉sqlserver的 - 甲骨文公司已经分析的功能,这使得这么多铁道部简单。你也许可以做到这一点只用像这样子查询:

SELECT [id] 
FROM (SELECT [id], min([date] AS minDate from [t1] GROUP BY [id]) AS t1_min 
WHERE NOT EXISTS (SELECT * FROM [t2] 
        WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1_min].[minDate]) AND [t1_min].[minDate]) 
+0

我喜欢这样,但是可以将它应用到从t1开始的MIN日期范围 – DataMan31

相关问题