2014-02-16 82 views
0

我需要SELECTTop 5记录来自表A而不是表B,然后将结果加入到另一个表中,这会给我所有与前5个相关的记录。最后,将代表插入表B它可以防止它们进入下一个结果集。如何根据一对多关系选择记录并从一个表中不选择另一个表?

要获得前5名,我写了下面的查询:

WITH DistinctCustomerRep AS 
(
SELECT DISTINCT TOP 5 CustomerRepID 
FROM MySchema.TableA A 

WHERE NOT EXISTS (SELECT CustomerRepID FROM MySchema.MyTableB B 
WHERE CustomerRepID = A.CustomerRepID) 

OR A.ModifiedDate >= DATEADD(SECOND, -30, GETDATE()) 
OR A.CreatedDate >= DATEADD(SECOND, -30, GETDATE()) 
) 
SELECT * CustomerID, CustomerLName  
FROM MySchema.TableA 

接下来,我需要得到所有相关的前5名记录我以前的结果集的客户。目标是找到与上述前5条记录相关的所有客户。

我添加以下代码:

SELECT CustomerID, CustomerLName 

FROM MySchema.TableA A 

INNER JOIN DistinctCustomerRep B ON A.CustomerRepID = B.CustomerRepID 

WHERE NOT EXISTS (SELECT CustomerRepID FROM MySchema.MyTableB B 
WHERE CustomerRepID = A.CustomerRepID) 

OR A.ModifiedDate >= DATEADD(SECOND, -30, GETDATE()) 
OR A.CreatedDate >= DATEADD(SECOND, -30, GETDATE()) 

ORDER BY A.CustomerRepID ASC; 

结果给了我只有5个客户代表,也返回所有相关的5所代表的客户。

我遇到更新部分ModifiedDate ColumnCreatedDate Column问题。如果查询出现问题或服务器稍有延迟,那么30秒钟将阻止任何结果,因为它已经过去了。如果我花时间太长,我可能会插入重复项。

注意:每次运行查询时,前五位代表被插入TableB,这只允许新的或更新的记录进入下一个结果集。为了简洁起见,我省去了插入部分。

有没有更好的选择来确保记录不会被重新插入?

回答

0

我不知道,我明白整个事情,并基于类似A.ModifiedDate >= DATEADD(SECOND, -30, GETDATE())并不似乎是一个好主意更新/插入,但我会尽力给你一个快速的答案:

WHERE NOT EXISTS (SELECT CustomerRepID FROM MySchema.MyTableB B 
        WHERE CustomerRepID = A.CustomerRepID) 

OR (
    (A.ModifiedDate >= DATEADD(SECOND, -30, GETDATE()) 
    OR A.CreatedDate >= DATEADD(SECOND, -30, GETDATE()) 
    ) AND NOT EXISTS (SELECT CustomerRepID FROM MySchema.MyTableB B 
        WHERE CustomerRepID = A.CustomerRepID) 
相关问题