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。
答案 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数据库中分配了空间,但通常只能从内存中访问,除非服务器处于内存压力之下,或者表中的数据量很大。