2011-11-15 53 views
0

帐户(表)最佳方式加入两个表*包括*副本从一个表

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

支出(表)

+----+----------+----------+-------------+--------+ 
| 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字段来加入这两个表,这是我们无法解决的一个问题。因此我们根据账号#,供应商ID(第二和第三列)加入。这会产生一个问题,它可能会创建(可能)多对多的关系。但是,如果它们处于活动状态,我们会过滤我们的记录,并在创建支出时在支付表上使用第二个过滤器。付款是按月份创建的。有两个问题在我看来

  1. 查询需要相当长的时间才能完成(可能是低效)
  2. 有一些重复的是被删除不应删除。示例是支付表中的记录6和8。这里发生的事情是,我们找到了一位顾客,然后顾客取消了,然后他又找回了顾客。在这种情况下+50,-50和+50。再次,所有值都是有效的,并且必须显示在报告中以用于审计目的。目前只显示一个+50,另一个丢失。报告中偶尔会遇到一些其他问题。

这是查询结果。它使用组来删除重复项。我希望提前查询的表现优于其他表,并且考虑到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查询。

+0

你可以在选择中显示你的实际字段吗?知道从哪个表获取哪些字段是相关的。 – JNK

+1

你究竟想要什么?你说你有'重复'的问题,但似乎想要多行(7和8)。具有当前/期望的结果集将是有帮助的。 –

+0

我有重复删除的问题。他们被删除,但他们应该在那里。恐怕我无法发布实际的查询。我的查询与实际查询非常相似,除了在实际查询中使用MAX(col1 case语句)并且我发现这是unnesssary。这导致使用10组通过语句。我想要一个专家意见,如果这是一个健全的查询如何改进/修复它。 –

回答

0

很难准确理解你想要什么,因为在一个地方,你说你想“重复”,但是你说你正在使用该组来删除重复项。所以首先想到的将是“为什么不只是摆脱小组?”。但是我必须相信你足够聪明才能想到你自己,所以我认为它必须在那里出于某种原因。

我觉得有人在这里可以帮助你很轻松地,如果你能后的实际查询,但既然你说你不能我只是尽力给你解决问题的一些方向......

相反试图在一个语句中做所有事情,使用临时表或视图来分割它。你可能会更容易思考如何摆脱不需要的副本,并保留你先做的副本,然后将它们放到临时表中,然后将表加入到一起并处理。

+0

以前的程序员使用group by和distinct来移除重复项。我们发现某些副本需要在那里,正如我在问题中所述。我已经使用CROSS APPLY重写了查询。我仍然排除故障并将结果与​​原始结果进行比较。我不认为这是常见的做法发布实际查询或可能是如果我可以改变它的很多东西。如果我不能解决问题,我可能会发布它。我的问题的另一部分是,这个查询是否正常。性能改进能写得更好吗? –

+0

不管声音是否是一个主观的问题。我的方法是尽量不要在我的顶级查询中补偿坏数据。这意味着我可能有一个查询或一个视图,过滤/转换数据应该是第一次,然后我查询该数据。 –

相关问题