Sql 获取在特定日期之前创建且在该日期之后未引用的ID

Sql 获取在特定日期之前创建且在该日期之后未引用的ID,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图从一个查询中获取ID列表,该查询依赖于另一行的ID引用列和日期列中的值 基本上,我试图检索在指定日期创建列之前创建的记录的ID,除非该记录被另一个在该日期之后创建的RefID列引用 我计划在某个时候在存储过程中使用它,但暂时只使用一个变量 下面是一个非常简单的示例表。为了简单起见,省略了不相关的列 +--------+---------+---------------+ | ID | RefID | Created | +--------+---------+---

我试图从一个查询中获取ID列表,该查询依赖于另一行的ID引用列和日期列中的值

基本上,我试图检索在指定日期创建列之前创建的记录的ID,除非该记录被另一个在该日期之后创建的RefID列引用

我计划在某个时候在存储过程中使用它,但暂时只使用一个变量

下面是一个非常简单的示例表。为了简单起见,省略了不相关的列

+--------+---------+---------------+
|   ID   |  RefID  |    Created    |
+--------+---------+---------------+
|  123   |  NULL   |  2016-10-18   |
|  456   |  123    |  2016-10-20   |
|  789   |  NULL   |  2016-10-18   |
|  111   |  789    |  2016-10-18   |
+--------+---------+---------------+
因此,在上面的示例表中,如果我指定2016-10-19,我将返回ID789和111。我不会得到123,因为尽管它是在2016年10月18日之前创建的,但它被456引用,而456不是,因此我也不会得到456

我一直在玩弄加入的各种变化,但SQL绝对不是我的强项,所以我觉得我好像在兜圈子,在寻找错误的解决方案! 到目前为止,我已经有了这个,我想这会让我在某个日期之后得到正确的ID引用列表。我不太确定如何从我的主查询中排除这个列表……更不用说合适的主查询了

DECLARE @myDate datetime
SET @myDate = '2016-10-19'

SELECT t1.id
FROM MyDB.dbo.[myTable] AS t1
JOIN MyDB.dbo.[myTable] AS t2
ON t1.id = t2.ref_id
WHERE t1.id = t2.ref_id AND t2.created > @myDate
编辑:我意识到,在接受解决方案并重新阅读原始请求后,您并没有要求排除t1创建后具有相关t2记录的t1记录,而是在mydate之后。我在下面相应地修改了我的查询,但是我想,vkp查询的性能也比我修改后的答案好

我从您的询问开始,并得出以下建议:

 SELECT t1.id
   FROM MyDB.dbo.[myTable] AS t1
   LEFT JOIN MyDB.dbo.[myTable] AS t2
     ON t1.id = t2.ref_id and t2.created > @mydate
  WHERE t2.id is null AND t1.created < @mydate
您可以使用not exists获取它,条件是检查引用的id在指定日期之后是否有行

SELECT id
FROM MyDB.dbo.[myTable] t1
WHERE NOT EXISTS (SELECT 1 FROM MyDB.dbo.[myTable] 
                  WHERE t1.id = ref_id 
                  AND created > @myDate) 
AND created < @myDate

我能扩展这个来考虑2个不同的日期吗?假设我想要日期[X]之前的ID,并且如果它们被引用,则引用必须在日期[Y]之前创建?当然。您可以这样做。抱歉,在我开始盲目地将值放入测试之前,请确保。这只是第6行@myDate的使用变量[X]和第5行@myDate的新变量[Y]吗?是的,内部条件检查是否有任何引用id的日期更晚,外部条件是给定日期之前的id。您可以相应地修改它。
SELECT id
FROM MyDB.dbo.[myTable] t1
WHERE NOT EXISTS (SELECT 1 FROM MyDB.dbo.[myTable] 
                  WHERE t1.id = ref_id 
                  AND created > @myDate) 
AND created < @myDate