【问题标题】:SQL Server Left Join producing duplicatesSQL Server Left Join 产生重复项
【发布时间】:2020-09-19 22:53:18
【问题描述】:

我有 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”。我该怎么做?

【问题讨论】:

  • 数据图像确实不能帮助我们在这里为您提供帮助。请花时间以可消耗的格式提供样本数据;表格格式的text 或(甚至更好)DDL 和 DML 语句。
  • 至于您的问题,您为什么不期望BudgetID 3 有4 行?它在Expenses 表中有3 行。
  • @Larnu 如果您查看 收入表,则只有 1 行与 BudgetID 3 相关联,但是,如果您查看 b>Left Join Results,返回3条额外记录。
  • 由于相同预算 ID 的费用表中多了 3 行,您将获得 3 个额外结果
  • 您的结果包括每个ExpensesID 的一行,这正是您的查询所要求的。这些不是重复的行。将ExpensesAmounts 更改为四个不同的数字以更清楚地看到这一点。问题是,你想用这四个数字做什么?你的问题没有说清楚,所以到目前为止,每个人都只是在猜测你的意图。

标签: sql sql-server database left-join sql-server-2019


【解决方案1】:

每个budgetIDexpenses 中有几行,因此您的联接会产生那么多行。我倾向于怀疑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 有多个值)。

【讨论】:

    【解决方案2】:

    对于 budgetID 3 ,您的费用表中有 4 个费用(不同的费用 ID)为 50.00 用于同一用户。我认为您想要的是相同类别和预算 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'
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2013-03-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多