我需要来自TableA中的SELECT
记录而不是TableB中的Top 5
记录,然后将结果加入到另一个表中,这将为我提供与前5个相关的所有记录。最后,将Reps插入到 TableB 会阻止它们进入下一个结果集。
要获得前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中,这样只允许新的或更新的记录进入下一个结果集。为简洁起见,我省略了插入部分。
是否有更好的替代方案可以确保不会重新插入记录?
答案 0 :(得分: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)