加入两个表*的最佳方式,包括*表中的*重复项

时间:2011-11-15 20:57:44

标签: sql sql-server-2005 join group-by cross-apply

帐户(表格)

+----+----------+----------+-------+
| id | account# | supplier | RepID |
+----+----------+----------+-------+
|  1 | 123xyz   | Boston   |     2 |
|  2 | 245xyz   | Chicago  |     2 |
|  3 | 425xyz   | Chicago  |     3 |
+----+----------+----------+-------+

PayOut(表格)

+----+----------+----------+-------------+--------+
| id | account# | supplier | datecreated | Amount |
+----+----------+----------+-------------+--------+
|  5 | 245xyz   | Chicago  | 01-15-2009  | 25     |
|  6 | 123xyz   | Boston   | 10-15-2011  | 50     |
|  7 | 123xyz   | Boston   | 10-15-2011  | -50    |
|  8 | 123xyz   | Boston   | 10-15-2011  | 50     |
|  9 | 425xyz   | Chicago  | 10-15-2011  | 100    |
+----+----------+----------+-------------+--------+

我有帐户表,我有支付表。支付表来自国外,因此我们无法控制它。这给我们留下了一个问题,即我们无法根据记录ID字段加入这两个表,这是我们无法解决的一个问题。因此,我们基于Account#,SupplierID(第2和第3列)加入。这会产生一个问题,即它可能会产生多对多的关系。但是如果它们处于活动状态我们会过滤我们的记录,并且在创建支出时我们会在支付表上使用第二个过滤器。付款是按月创建的。我认为这有两个问题

  1. 查询需要相当长的时间才能完成(可能效率低下)
  2. 删除了某些不应删除的重复项。示例是支付表中的记录6和8。这里发生了什么,我们有一个客户,然后客户取消,然后他让他回来。在这种情况下+ 50,-50和+50。同样,所有值都是有效的,并且必须在报告中显示以用于审计目的。目前只显示一个+50,另一个丢失。报告中还有一些其他问题偶尔出现。
  3. 这是查询。它使用group by删除重复项。我希望有一个优先考虑的预先查询,并考虑到PayOut表中的任何记录都不会重复,只要它们在报告的月份出现。

    这是我们当前的查询

    /* Supplied  to Store Procedure */
    -----------------------------------
    @RepID // the person for whome payout is calculated
    @Month // of payment date
    @year  // year of payment date
    -----------------------------------
    select distinct 
    A.col1, 
    A.col2,
    ...
    A.col10, 
    B.col2, 
    B.Col2, 
    B.Amount /* this is the important column, portion of which goes to Rep */
    from records A
    JOIN payout B 
    on A.Supplier = B.Supplier AND A.Account# = B.Account#
    where datepart(mm, B.datecreated) = @Month /* parameter to stored procedure */
      and datepart(yyyy, B.datecreated) = @Year
      and A.[rep ID] = @RepID /* parameter to SP */
    group by
    col1,col2,col3,....col10
    order by customerName
    

    此查询是否最佳?我可以使用CROSS APPLY或WHERE EXIST来改进它,使其更快并消除重复的问题吗?

    请注意,此查询用于获取代表的付款。因此,每个记录都有repid字段,它被分配给它。理想情况下,我想使用Select WHERE Exist查询。

1 个答案:

答案 0 :(得分:0)

很难准确理解你想要什么,因为在一个地方你说'你想要'重复,但是你说你正在使用group by删除重复项。所以第一个想法是“为什么不只是摆脱这个群体?”。但是我必须相信你已经足够聪明,可以自己想到这一点,所以我认为它必须在那里存在。

我认为,如果您可以发布实际查询,这里有人可以很轻松地帮助您,但是既然您说不能,我会尝试给您一些方向来解决问题......

不要尝试在一个语句中执行所有操作,而是使用临时表或视图将其拆分。你可能更容易想到如何摆脱你不想要的副本,并保留你先做的那些并将它们放到一个临时表中,然后将这些表连接在一起并使用它。