SQL Server Left Join 产生重复项
SQL Server Left Join producing duplicates
我有 3 个 table,预算、收入和支出。
预算 table:
收入 table:
费用 table:
这是我的SQL声明:
SELECT
Budgets.BudgetID, Budgets.BudgetName, Budgets.Username_FK,
Budgets.BudgetAmount, Budgets.SavePercentage,
Expenses.ExpensesID, Expenses.ExpensesAmount, Expenses.ExpensesCategory,
Income.IncomeID, Income.IncomeAmount, Income.IncomeCategory
FROM
Budgets
LEFT JOIN
Income ON Budgets.BudgetID = Income.BudgetID_FK
LEFT JOIN
Expenses ON Budgets.BudgetID = Expenses.BudgetID_FK
WHERE
BudgetName = '2019
结果如下:
根据我的 Income
table,只有 1 条记录绑定到 BudgetID = 3
,但在左连接中,它重复了。
理想情况下,我希望它在副本上 return "null"。我该怎么做?
您在每个 budgetID
中的 expenses
中有几行,因此您的联接会产生那么多行。我倾向于怀疑 income
也会发生同样的情况。
如果您想要每个 budgetID
一行,那么一个选项是预聚合和 left join
(或 outer apply
)。假设您想要每个预算的总支出和收入,您会这样做:
select b.*, e.expenseAmount, i.amountAmount
from budgets b
left join (
select budgetID_FK, sum(expenseAmount) expenseAmount
from expenses
group by budgetID_FK
) e on e.budgetID_FK = b.budgetID
left join (
select budgetID_FK, sum(incomeAmount) incomeAmount
from income
group by budgetID_FK
) i on i.budgetID_FK = b.budgetID
现在您按 budgetID
对相关表中的行进行分组,因此您看不到这些表的其他列,例如 incomeCategory
或 expenseCategory
(其中有每个 budgetID
).
多个值
对于 budgetID 3,您有 4 笔费用(不同的费用 ID),费用为 50.00 table 同一用户。我认为您想要的是相同类别和预算 ID 的总费用,即本例中的 budgetID 3
SELECT
Budgets.BudgetID, Budgets.BudgetName, Budgets.Username_FK,
Budgets.BudgetAmount, Budgets.SavePercentage,
Income.IncomeID, Income.IncomeAmount, Income.IncomeCategory,
ex.ExpensesCategory,
ex.Total_ExpensesAmount,
FROM Budgets
LEFT JOIN Income ON Budgets.BudgetID = Income.BudgetID_FK
LEFT JOIN (Select BudgetID_FK, ExpensesCategory, SUM(ExpensesAmount) as Total_ExpensesAmount
FROM Expenses
GROUP BY BudgetID_FK, ExpensesCategory) ex ON Budgets.BudgetID = ex.BudgetID_FK
WHERE BudgetName = '2019'
我有 3 个 table,预算、收入和支出。
预算 table:
收入 table:
费用 table:
这是我的SQL声明:
SELECT
Budgets.BudgetID, Budgets.BudgetName, Budgets.Username_FK,
Budgets.BudgetAmount, Budgets.SavePercentage,
Expenses.ExpensesID, Expenses.ExpensesAmount, Expenses.ExpensesCategory,
Income.IncomeID, Income.IncomeAmount, Income.IncomeCategory
FROM
Budgets
LEFT JOIN
Income ON Budgets.BudgetID = Income.BudgetID_FK
LEFT JOIN
Expenses ON Budgets.BudgetID = Expenses.BudgetID_FK
WHERE
BudgetName = '2019
结果如下:
根据我的 Income
table,只有 1 条记录绑定到 BudgetID = 3
,但在左连接中,它重复了。
理想情况下,我希望它在副本上 return "null"。我该怎么做?
您在每个 budgetID
中的 expenses
中有几行,因此您的联接会产生那么多行。我倾向于怀疑 income
也会发生同样的情况。
如果您想要每个 budgetID
一行,那么一个选项是预聚合和 left join
(或 outer apply
)。假设您想要每个预算的总支出和收入,您会这样做:
select b.*, e.expenseAmount, i.amountAmount
from budgets b
left join (
select budgetID_FK, sum(expenseAmount) expenseAmount
from expenses
group by budgetID_FK
) e on e.budgetID_FK = b.budgetID
left join (
select budgetID_FK, sum(incomeAmount) incomeAmount
from income
group by budgetID_FK
) i on i.budgetID_FK = b.budgetID
现在您按 budgetID
对相关表中的行进行分组,因此您看不到这些表的其他列,例如 incomeCategory
或 expenseCategory
(其中有每个 budgetID
).
对于 budgetID 3,您有 4 笔费用(不同的费用 ID),费用为 50.00 table 同一用户。我认为您想要的是相同类别和预算 ID 的总费用,即本例中的 budgetID 3
SELECT
Budgets.BudgetID, Budgets.BudgetName, Budgets.Username_FK,
Budgets.BudgetAmount, Budgets.SavePercentage,
Income.IncomeID, Income.IncomeAmount, Income.IncomeCategory,
ex.ExpensesCategory,
ex.Total_ExpensesAmount,
FROM Budgets
LEFT JOIN Income ON Budgets.BudgetID = Income.BudgetID_FK
LEFT JOIN (Select BudgetID_FK, ExpensesCategory, SUM(ExpensesAmount) as Total_ExpensesAmount
FROM Expenses
GROUP BY BudgetID_FK, ExpensesCategory) ex ON Budgets.BudgetID = ex.BudgetID_FK
WHERE BudgetName = '2019'