【问题标题】:TSQL Get records that don't exist in a tableTSQL 获取表中不存在的记录
【发布时间】:2014-10-08 05:28:47
【问题描述】:

我有一个表格,其中包含员工的数据和他们填写的问卷调查的结果。问卷有 3 个问题,但并非所有问题都必须回答。我试图找出员工没有回答的问题。

员工数据:

EmployeeID | Question | Answer
-------------------------------
12345      | 1        | 100
-------------------------------
12345      | 2        | 85
-------------------------------
11111      | 1        | 100
-------------------------------
11111      | 2        | 90
-------------------------------
11111      | 3        | 25
-------------------------------

如果使用上面的表格,我正在尝试编写一个返回的查询:

EmployeeID | Question
----------------------
12345      | 3 
----------------------

非常感谢任何帮助!

【问题讨论】:

  • 你有问题定义表吗?这样就很简单了。
  • @SeanLange 我目前没有问题表。创建一个不需要太多努力。

标签: sql sql-server inner-join exists not-exists


【解决方案1】:

类似的东西应该也可以。

select distinct question into #temp from EmployeeData

select ed.employeeid, a.question
from EmployeeData ed
cross join #temp a
where not exist (select 1 from EmployeeData ed1 where ed1.employeeid=ed.employeeid and ed1.question=a.question)

【讨论】:

    【解决方案2】:

    这样做的方法是为所有员工创建一个所有问题的列表,然后删除已经回答的问题。

    您可以使用子查询、cross joinleft outer join 来做到这一点:

    select e.*, q.*
    from (select distinct employeeid from employeedata) e cross join
         (select distinct question from employeedata) q left join
         employeedata ed
         on ed.employeeid = e.employeeid and ed.question = q.question
    where ed.employeeid is null;
    

    【讨论】:

    • 这是一个很好的开始!谢谢!此查询返回我没有回答的单个问题,但没有告诉我没有回答该问题的员工。有没有办法从您的查询中获取员工 ID 和问题?
    • @btjordan23:将select ed.*, q.* 替换为select e.*, q.*
    • 完美!非常感谢!
    • @juergend 。 . .谢谢。
    【解决方案3】:

    首先,您需要一份员工名单。更好的来源是雇员表(如果存在)。如果员工没有填写调查表怎么办?

    但根据您的要求,我们将使用表中的员工。

    SELECT DISTINCT EmployeeID FROM EmployeeData
    

    现在我们需要添加可能的问题。为此,您可以使用临时表,但我们将只使用硬编码的 sql。

    SELECT 1 AS Question UNION ALL SELECT 2 UNION ALL SELECT 3
    

    现在我们在没有加入条件的情况下加入它们。这将生成一个包含 EmployeeID 和 3 个问题中的每一个的表。现在我们可以从这个表中选择所有的可能性,并找到 EmployeeData 中不存在的那些。为此,我们将执行一系列表值子查询。

    SELECT EQ.EmployeeID, EQ.Question
    FROM (SELECT E.EmployeeID, Q.Question
          FROM (SELECT DISTINCT EmployeeID FROM EmployeeData) AS E
               INNER JOIN (SELECT 1 AS Question UNION ALL SELECT 2 UNION ALL SELECT 3) AS Q ON (1=1) ) AS EQ
    WHERE NOT EXISTS (SELECT Answer FROM EmployeeData WHERE EmployeeData.EmployeeID = EQ.EmployeeID AND EmployeeData.Question = EQ.Question)
    

    您还可以对员工数据进行外连接并检查空值,而不是使用不存在子句。

    SELECT EQ.EmployeeID, EQ.Question
    FROM (SELECT E.EmployeeID, Q.Question
          FROM (SELECT DISTINCT EmployeeID FROM EmployeeData) AS E
               INNER JOIN (SELECT 1 AS Question UNION ALL SELECT 2 UNION ALL SELECT 3) AS Q ON (1=1) ) AS EQ
         LEFT OUTER JOIN EmployeeData ON (EmployeeData.EmployeeID = EQ.EmployeeID AND EmployeeData.Question = EQ.Question)
    WHERE EmployeeData.Answer IS NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 2017-03-31
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多