У меня есть таблицы с именами:
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 и saleDetails, описанными выше, очевидны, а SaleID, а Target и TargetDetail связаны через TargetID. То, что я хочу показать, это продажи сотрудников и цели во все периоды Есть периоды, когда продажи отсутствуют, а в других периодах цели могут отсутствовать.
Мой план (до сих пор) состоит в том, чтобы использовать внутреннее объединение sale и saleDetail в одном подзапросе, target и targetDetail в другом подзапросе, а затем полное внешнее объединение в обоих подзапросах дает мне необходимые данные. Но результат очень медленный. что я могу сделать, чтобы ускорить производительность. Я нашел Google для сравнения производительности между полным внешним объединением и объединением, но мне не повезло. В настоящее время я понятия не имею, можно ли достичь желаемого результата с помощью 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)