值 2 在(值 1 - 5)和(值 1 + 5)之间

Value2 BETWEEN (Value1 - 5) AND (Value1 + 5)

SELECT *
FROM   Table1 D1 (nolock)
WHERE  1 = 1
    AND NOT EXISTS (SELECT TOP 1 *
FROM   Table2 D2 (nolock)
WHERE  d1.Account = d2.Account
    AND d2.Amount BETWEEN ( d1.Amount - 5 ) AND ( d1.Amount + 5 )
    AND Datediff(DD, d1.SALEDATE, d2.SALEDATE) BETWEEN 0 AND 60) 

我删除了很多与问题无关的功能。

本质上,我希望它在第一部分满足某些条件时查找记录(为简单起见,我在这里使用 1=1),然后排除在过去 60 天内有销售的任何金额-/+ 同一个账户 5 美元。

出于某种原因,它每次只是 returns 0 条记录,但在手动检查数据库 table 后,事实并非如此。我正在使用交易 SQL.

好的,解决了...很简单...我忘了从D1中排除结果。所以现在它有一个 d2.indexkey <> d1.indexkey 语句并且一切正常.. lol

最好使用 temp table 进行自连接或子查询,虽然这样会降低数据库处理率,但您会得到更快的结果。

SELECT * into #temp
FROM   Table1 D1


select * from #temp t1
WHERE  t1.id not in(
    SELECT t2.id
        FROM    #temp t2
    WHERE  t1.Account = t2.Account
        AND t2.Amount BETWEEN ( t1.Amount - 5 ) AND ( t1.Amount + 5 )
        AND Datediff(DD, t1.SALEDATE, t2.SALEDATE) BETWEEN 0 AND 60) 

然而,这只是您查询的替代方法。

温度的优势tables

  • table"exists"——也就是说,它被具体化为一个table,至少在内存中,它包含了结果集并且可以重复使用。

  • 在某些情况下,当您必须对数据执行一些复杂的转换时,可以提高性能或减少阻塞 - 例如,如果您想要获取一组 'snapshot' 行从繁忙的基础 table 中取出,然后对该集合进行一些复杂的计算,如果您从基础 table 中取出行并尽快解锁,则可以减少争用,然后独立完成工作。在某些情况下,相对于并发优势,实际临时 table 的开销很小。

  • Temp tables,虽然它们在 tempDB 数据库中已分配给它们 space,但通常只能从内存访问,除非服务器处于内存压力下,或者table里面的数据量很大