我需要SELECT
Top 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 Column
和CreatedDate Column
问题。如果查询出现问题或服务器稍有延迟,那么30秒钟将阻止任何结果,因为它已经过去了。如果我花时间太长,我可能会插入重复项。
注意:每次运行查询时,前五位代表被插入TableB,这只允许新的或更新的记录进入下一个结果集。为了简洁起见,我省去了插入部分。
有没有更好的选择来确保记录不会被重新插入?