【发布时间】:2011-06-17 07:34:30
【问题描述】:
我有名为:
mktActualsales (SaleID, EmployeeID, PeriodID,PositionID)
mktActualSalesItems(SaleItemID, saleID, Item, Quantity)
mktSalesTargets(TargetID, EmployeeID, PeriodID,PositionID)
mktSalesTargetItems(TargetITemID, TargetID,ItemID, Quantity )
sysPeriods(PeriodID, StartDate, EndDate)
上面的表sale和salesDetails之间的关系很明显,通过SaleID关联,Target和TargetDetail通过TargetID关联。我要显示的是员工在所有时期的销售额和目标。有些时期缺少销售,而在其他时期可能缺少目标。
我的计划(到目前为止)是在一个子查询中采用 sale 和 saleDetail 的内部联接,在另一个子查询中采用 target 和 targetDetail ,然后对两个子查询进行完全外部联接,从而获得我需要的数据。但结果非常缓慢。我可以做些什么来加快性能。我在谷歌上搜索了完全外部连接和联合之间的性能比较,但没有任何运气。目前我不知道使用 Union/Union All 是否可以达到我想要的结果。
编辑
这是我到目前为止的查询。也编辑了表格
SELECT sale.ActualSaleID,
COALESCE (sale.EmployeeID, saleTarget.EmployeeID) AS EmployeeID,
COALESCE (sale.PositionID, saleTarget.PositionID) AS PositionID,
COALESCE (sale.PeriodID, saleTarget.PeriodID) AS PeriodID,
COALESCE (sale.SKUID, saleTarget.SKUID) AS SKUID,
COALESCE (sale.SalesQuantity, 0) AS SalesQuantity,
saleTarget.SalesTargetID,
COALESCE (saleTarget.TargetQuantity, 0) AS TargetQuantity,
saleTarget.SalesTargetItemID,
sale.ActualSaleItemID,
p.StartDate,
p.EndDate
FROM (
SELECT s.ActualSaleID,
s.EmployeeID,
s.PeriodID,
s.PositionID,
si.ActualSaleItemID,
si.SKUID,
si.SalesQuantity
FROM dbo.mktActualSaleItems AS si
INNER JOIN dbo.mktActualSales AS s
ON si.ActualSaleID = s.ActualSaleID
) AS sale
FULL OUTER JOIN
(
SELECT t.EmployeeID,
t.PeriodID,
t.PositionID,
t.SalesTargetID,
ti.SKUID,
ti.TargetQuantity,
ti.SalesTargetItemID
FROM dbo.mktSalesTargetItems AS ti
INNER JOIN dbo.mktSalesTargets AS t
ON t.SalesTargetID = ti.SalesTargetID
) AS saleTarget
ON sale.PeriodID = saleTarget.PeriodID
AND sale.PositionID = saleTarget.PositionID
AND sale.SKUID = saleTarget.SKUID
INNER JOIN dbo.sysPeriods AS p
ON p.PeriodID = COALESCE (sale.PeriodID, saleTarget.PeriodID)
【问题讨论】:
-
两个子查询都在 PeriodID 和 EmployeeID 上外连接
-
您能否向我们提供您目前的查询以及您想要实现的一些示例?我不完全理解你想要的结果。
-
@Oliver Hanappi 编辑了问题
标签: sql sql-server-2008 union full-outer-join