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

时间:2015-08-17 04:29:51

标签: sql sql-server tsql between

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。

由于某种原因,它每次只返回0条记录,但在手动检查数据库表时,情况并非如此。我正在使用Transact SQL。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

最好使用临时表进行自联接或子查询,尽管数据库处理比率会降低,结果会更快。

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) 

但是,这只是您查询的替代方式。

临时表的优点

  • 表“存在” - 也就是说,它实现为一个表,至少在内存中,它包含结果集并且可以重复使用。

  • 在某些情况下,当您必须对数据执行一些精细的转换时,可以提高性能或减少阻塞 - 例如,如果要从基表中获取“快照”行集,忙,然后对该集进行一些复杂的计算,如果你从基表中获取行并尽快解锁它,那么可以减少争用,然后独立完成工作。在某些情况下,真实临时表的开销相对于并发的优势而言很小。

  • 临时表虽然在tempDB数据库中分配了空间,但通常只能从内存中访问,除非服务器处于内存压力之下,或者表中的数据量很大。