值 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里面的数据量很大
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里面的数据量很大