优化重复联合所有 SSMS 查询
Optimize a Repeating Union All SSMS Query
我正在创建一份将上传到 QuickBooks 的报告。由于每个查询中的单个计算更改,我必须 UNION ALL 7 查询。下面是前两个查询的示例:
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Debt') as 'Memo'
,Compensation.Payment as 'Amount'
FROM Compensation
JOIN Clients on Id = Compensation.ClientId
UNION ALL
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Insurance') as 'Memo'
,InsuranceInvoices.WeeklyAmount
FROM InsuranceInvoices
是否有任何方法可以消除为每个联合重复 Clients.Id、@CNumber、@TDate、CONCAT(@Memo、Variable) 的需要?
对于 CONCAT(@MEMO, variable) as 'Memo',我也许可以创建一个数组并在 Union ALL 的每个新迭代中插入(不知道这是否可能)。
我被卡住的地方是,不确定如何创建一个循环来迭代前 4 列,每次新计算 'Amount'。
这只是为了 optimization/code 可读性。查询有效,并没有那么慢。但是,它有 155 行长,我想知道下次我做类似的事情时是否可以尝试不同的做法。
我目前研究的内容:下面的 Stack Overflow link 有点相似,但是,它没有使用不同的 'FROM' 表。数据来自单个 table。我的数据来自 4 tables。下面是来自同一个 table:
的两个查询示例
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Debt') as 'Memo'
,Compensation.PaybackAmount as 'Amount'
FROM Compensation
JOIN Clients on Id = Compensation.ClientId
WHERE
Compensation.Week = @TrailingWeekEnd
UNION ALL
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Vehicle') as 'Memo'
,Compensation.VDAccumulation as 'Amount'
FROM ContractorSettlements
JOIN Clients on Id = Compensation.ClientId
WHERE
Compensation.Week = @TrailingWeekEnd
如果这是个糟糕的问题,我深表歉意。在我看来,我想象这是在一个循环中工作,但老实说我不知道如何优化它。如果我能提供更多信息,请告诉我。
尽管查询中的语法错误,但您可以使用以下内容
说明
- 只查询需要从tables
中提取的数据
- 通过为每个 table 添加类型来区分数据,例如
Debt
和 Vehicle
- 将结果与你想要的参数组合
查询
;with report as(
select [Id] = ClientId,
[Amount] = PaybackAmount,
[Type] = 'Debt'
Compensation c
where c.Week = @TrailingWeekEnd
union all
select ClientId,
VDAccumulation,
'Vehicle'
from ContractorSettlements c
where c.Week = @TrailingWeekEnd
)
select Id,
[Check Number] = @CNumber,
[Transac Date] = @TDate,
[Memo] = Concat(@Memo,[Type]),
Amount
from report
希望对您有所帮助
我正在创建一份将上传到 QuickBooks 的报告。由于每个查询中的单个计算更改,我必须 UNION ALL 7 查询。下面是前两个查询的示例:
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Debt') as 'Memo'
,Compensation.Payment as 'Amount'
FROM Compensation
JOIN Clients on Id = Compensation.ClientId
UNION ALL
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Insurance') as 'Memo'
,InsuranceInvoices.WeeklyAmount
FROM InsuranceInvoices
是否有任何方法可以消除为每个联合重复 Clients.Id、@CNumber、@TDate、CONCAT(@Memo、Variable) 的需要?
对于 CONCAT(@MEMO, variable) as 'Memo',我也许可以创建一个数组并在 Union ALL 的每个新迭代中插入(不知道这是否可能)。
我被卡住的地方是,不确定如何创建一个循环来迭代前 4 列,每次新计算 'Amount'。
这只是为了 optimization/code 可读性。查询有效,并没有那么慢。但是,它有 155 行长,我想知道下次我做类似的事情时是否可以尝试不同的做法。
我目前研究的内容:下面的 Stack Overflow link 有点相似,但是,它没有使用不同的 'FROM' 表。数据来自单个 table。我的数据来自 4 tables。下面是来自同一个 table:
的两个查询示例 SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Debt') as 'Memo'
,Compensation.PaybackAmount as 'Amount'
FROM Compensation
JOIN Clients on Id = Compensation.ClientId
WHERE
Compensation.Week = @TrailingWeekEnd
UNION ALL
SELECT
Clients.Id
,@CNumber as 'Check Number'
,@TDate as 'Transac Date'
,CONCAT(@Memo, 'Vehicle') as 'Memo'
,Compensation.VDAccumulation as 'Amount'
FROM ContractorSettlements
JOIN Clients on Id = Compensation.ClientId
WHERE
Compensation.Week = @TrailingWeekEnd
如果这是个糟糕的问题,我深表歉意。在我看来,我想象这是在一个循环中工作,但老实说我不知道如何优化它。如果我能提供更多信息,请告诉我。
尽管查询中的语法错误,但您可以使用以下内容
说明
- 只查询需要从tables 中提取的数据
- 通过为每个 table 添加类型来区分数据,例如
Debt
和Vehicle
- 将结果与你想要的参数组合
查询
;with report as(
select [Id] = ClientId,
[Amount] = PaybackAmount,
[Type] = 'Debt'
Compensation c
where c.Week = @TrailingWeekEnd
union all
select ClientId,
VDAccumulation,
'Vehicle'
from ContractorSettlements c
where c.Week = @TrailingWeekEnd
)
select Id,
[Check Number] = @CNumber,
[Transac Date] = @TDate,
[Memo] = Concat(@Memo,[Type]),
Amount
from report
希望对您有所帮助