如何根据一对多关系和一个不在另一个表中的表选择记录?

时间:2014-02-16 08:54:51

标签: sql sql-server tsql

我需要来自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 ColumnCreatedDate Column的问题。如果查询出现问题或服务器稍有延迟,则30秒的时间将阻止任何结果,因为它已经过了。如果我把时间花了太长时间,我冒险插入重复项。

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

是否有更好的替代方案可以确保不会重新插入记录?

1 个答案:

答案 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)