帐户(表)最佳方式加入两个表*包括*副本从一个表
+----+----------+----------+-------+
| 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(第二和第三列)加入。这会产生一个问题,它可能会创建(可能)多对多的关系。但是,如果它们处于活动状态,我们会过滤我们的记录,并在创建支出时在支付表上使用第二个过滤器。付款是按月份创建的。有两个问题在我看来
- 查询需要相当长的时间才能完成(可能是低效)
- 有一些重复的是被删除不应删除。示例是支付表中的记录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查询。
你可以在选择中显示你的实际字段吗?知道从哪个表获取哪些字段是相关的。 – JNK
你究竟想要什么?你说你有'重复'的问题,但似乎想要多行(7和8)。具有当前/期望的结果集将是有帮助的。 –
我有重复删除的问题。他们被删除,但他们应该在那里。恐怕我无法发布实际的查询。我的查询与实际查询非常相似,除了在实际查询中使用MAX(col1 case语句)并且我发现这是unnesssary。这导致使用10组通过语句。我想要一个专家意见,如果这是一个健全的查询如何改进/修复它。 –