【问题标题】:SQL: Count rows which are not present in tableSQL:计算表中不存在的行
【发布时间】:2014-03-13 10:11:50
【问题描述】:

我有两个表名为:EmployeeTable 和 TaskAssignmentTable。 它们看起来像这样:
TaskAssignmentTable 显示分配给员工的任务。为了将新任务分配给员工,我希望将任务计数分配给不同的人,然后将任务分配给分配任务最少的人。
问题:在 TaskAssignmentTable 上使用正常的 count() 结果在此表中:
但我想要的是表之间的某种连接,它显示第一个表中存在的行数和第二个表中不存在的行数,计数等于 0,如下所示:

那么连接表并执行此类操作的 SQL 查询是什么? (可选:由于我使用的是 C# Linq-2-SQL,如果有人可以为此编写 LINQ 语法,我将不胜感激。

【问题讨论】:

  • 向我们展示您尝试过的东西?
  • 我不知道如何使用表连接并一起计算第二张表
  • FKemployeeid 是整数还是字符串??你能提供一个 sqlfiddle
  • 你需要的是一个外连接:阅读我的答案:stackoverflow.com/questions/22375246/…
  • 您想要 SQL 答案还是 Linq2Sql 答案?在 Linq2Sql 中,翻译可能出人意料地“非惯用”。如果纯 SQL 答案已足够/需要,请删除 C#/linq-to-sql 标记。

标签: c# sql sql-server linq-to-sql


【解决方案1】:

您需要一个LEFT OUTER JOIN,根据您的声明,您希望行出现在第一个表中而不是第二个表中:

SELECT EmployeeID, Name, Count(TaskID) as CNT
FROM EmployeeTable e
LEFT JOIN TaskAssignmentTable t 
    ON e.employeeID = t.FKEmployeeID
GROUP BY EmployeeID, Name

【讨论】:

  • 是的,我可以但找不到您问题的链接
  • 我现在已经回答了你的 C# 问题!
【解决方案2】:

试试

SELECT EmployeeID, Name, Count(TaskID) as CNT
FROM EmployeeTable emp
LEFT JOIN TaskAssignmentTable task on emp.employeeID = task.FKEmployeeID
GROUP BY EmployeeID, Name

【讨论】:

  • 我测试了您的语句,但它没有返回任何计数 = 0 的行。我的意思是它仍然没有在第二个表中显示缺少的行。
  • 我的 sn-p 是:SELECT emp.id, Name, Count(taskAssignment.taskID) as CNT FROM employee emp JOIN taskAssignment on emp.id = taskAssignment.FKEmployeeID GROUP BY emp.id, Name
  • 用左连接试试。更新了我的答案。
【解决方案3】:

为此,您必须使用 Left Outer Join

SELECT EmployeeID, Name, Count(TaskID) as CNT
FROM EmployeeTable emp
LEFT OUTER JOIN TaskAssignmentTable task on emp.employeeID = task.FKEmployeeID
GROUP BY EmployeeID, Name

这个查询的 LINQ 版本看起来像这样

var employees = from emp in dbContext.Employees
                join task in dbContext.TaskAssignmentTable 
                on emp.employeeID equals task.FKEmployeeID
                into tEmpWithTask
                from tEmp in tEmpWithTask.DefaultIfEmpty()
                group tEmp by new { emp.EmployeeID, emp.Name } into grp
                select new {
                  grp.Key.EmployeeID,
                  grp.Key.Name,
                  grp.Count(t=>t.TaskID != null)
                };  

【讨论】:

    【解决方案4】:

    你需要OUTER JOIN这两个表(在你的情况下是LEFT JOIN):

    SELECT EmployeeID, Name, Count(TaskID) as CNT
    FROM EmployeeTable emp
    LEFT JOIN TaskAssignmentTable task on emp.employeeID = task.FKEmployeeID
    GROUP BY EmployeeID, Name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2022-11-17
      • 2018-11-09
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多