【问题标题】:SQL count with another table in SELECT clauseSELECT 子句中另一个表的 SQL 计数
【发布时间】:2014-06-09 13:01:16
【问题描述】:

在我的数据库中,有 2 个不同的字段

i.) 员工 ii.) 部门

在我的employee 表中,

NAME      Department
---------------------
John          IT
Siti       Research
Jason      Research

在我的Department

Name
------------
IT
Research
Computer

使用语句

SELECT DEPARTMENT.DNAME
FROM DEPARTMENT,
     EMPLOYEE
WHERE DEPARTMENT.DNAME = EMPLOYEE.DNAME
  AND
    (SELECT COUNT(*)
     FROM EMPLOYEE.DNAME)=0;

department 中没有员工时会显示

Name
--------------
Computer

继续尝试,但出现了一些错误

【问题讨论】:

  • 你遇到了什么错误
  • SELECT DISTINCT dname FROM department WHERE dname NOT IN (SELECT dname FROM employee)?
  • 缺少表达式@neel

标签: mysql sql sql-server oracle


【解决方案1】:

两种选择:

  1. 使用IN

    SELECT name FROM Department
    WHERE name NOT IN (SELECT DISTINCT Department 
                       FROM Employee)
    
  2. 使用Left Join

    SELECT D.NAME 
    FROM DEPARTMENT D LEFT JOIN EMPLOYEE ON D.NAME = EMPLOYEE.Department
    WHERE EMPLOYEE.Department IS NULL
    

    Fiddle 中的示例。

    如果您的表中有数千条记录,则此方法将显示出比其他方法更高的性能。

【讨论】:

  • 在 MySQL 上的连接很可能更快,对于其他 RDBMS 则不确定。
  • +1 用于不为 NULL 的 LEFT JOIN。我会测试一下。
【解决方案2】:

试试NOT IN。子查询需要DISTINCT 以避免将来出现性能问题:

SELECT name FROM Department
WHERE name NOT IN ( SELECT DISTINCT Department FROM Employee);

NOT EXIST,在大多数情况下更快:

SELECT name FROM Department
WHERE NOT EXIST  ( SELECT 1 FROM Employee 
                   WHERE Employee.Department = Department.name);

【讨论】:

  • 您可能应该将DISTINCT 移动到外部选择,据我所知,它在IN 子句中不是很有用。你能解释一下你在谈论什么性能问题吗?
  • DISTINCT 是防止重复数据不是
  • DISTINCT 不能避免性能问题。它可以创建它们,因为它需要一个独特的排序。
  • 当我们有很大的Department 表时,Employee 表中可能会出现重复的Department Name 记录。对于每个部门,Oracle 将检查子查询中的每条记录(在其他 DBMS 中不确定)。如果我错了,请纠正我。
  • @JoachimIsaksson:此外,Department Name 在 Department 表中应该是唯一的。
【解决方案3】:

您没有说明您的错误,但您可以选择所有未出现在员工表中的部门:

SELECT DEPARTMENT.DNAME 
FROM DEPARTMENT 
WHERE DEPARTMENT.DNAME NOT IN (SELECT DEPARTMENT FROM EMPLOYEE);

【讨论】:

    【解决方案4】:
    SELECT D.Name
    FROM Employee E
    RIGHT JOIN Department D
    ON E.Department=D.Name
    WHERE E.Department IS NULL
    

    SQL Fiddle DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多