SQL服务器左连接产生重复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL服务器左连接产生重复相关的知识,希望对你有一定的参考价值。
我有3张表,分别是预算、收入和支出。
预算表 表:
收入 表。
支出 表。
这是我的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
表,只有 1 条记录与 BudgetID = 3
但在左连接中,它是重复的。
理想的情况是,我希望它对重复的数据返回 "null"。我应该怎样做呢?
答案
你有几条记录在 expenses
每 budgetID
所以你的连接产生了那么多行。我倾向于怀疑同样的情况也可能发生在 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
).
另一答案
对于预算ID 3,您有4个支出(不同的支出ID),在您的支出表中为同一个用户50.00。我想您需要的是同一类别和预算ID的总费用,即预算ID 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'
以上是关于SQL服务器左连接产生重复的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:如果左连接没有结果,则返回占位符/文本[重复]