SQL服务器左连接产生重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL服务器左连接产生重复相关的知识,希望对你有一定的参考价值。

我有3张表,分别是预算、收入和支出。

预算表 表:

enter image description here

收入 表。

enter image description here

支出 表。

enter image description here

这是我的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

结果如下

enter image description here

根据我的 Income 表,只有 1 条记录与 BudgetID = 3但在左连接中,它是重复的。

理想的情况是,我希望它对重复的数据返回 "null"。我应该怎样做呢?

答案

你有几条记录在 expensesbudgetID所以你的连接产生了那么多行。我倾向于怀疑同样的情况也可能发生在 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所以你无法看到这些表的其他列,如 incomeCategoryexpenseCategory (每份文件有多个值) 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 重复行

SQL左连接和group_concat返回重复数据

SQL Server:如果左连接没有结果,则返回占位符/文本[重复]

更新 ORA-00971 时左连接:缺少 SET 关键字 SQL [重复]

左连接返回重复的行

SQL左连接避免空条目