How to search for what is missing with MS SQL Server

Summary

It's very easy to find 'what's there', such as what are the employees in a department.

DEPTNO  DEPTNAME                        MGRNO   EMPNO   FIRSTNME    LASTNAME
--------------------------------------------------------------------------
A00     SPIFFY COMPUTER SERVICE DIV.    000010  000010  CHRISTINE   HAAS
A00     SPIFFY COMPUTER SERVICE DIV.    000010  000110  VINCENZO    LUCCHESSI
A00     SPIFFY COMPUTER SERVICE DIV.    000010  000120  SEAN        O'CONNELL
C01     INFORMATION CENTER              000030  000030  SALLY       KWAN
C01     INFORMATION CENTER              000030  000130  DOLORES     QUINTANA
C01     INFORMATION CENTER              000030  000140  HEATHER     NICHOLLS

But what about: what are the departments without any employee? What's missing? MS SQL Server provides an easy solution.

Data used

Department info

  1. SELECT Deptno, DeptName, MgrNo, AdmrDept
  2. FROM department;
Deptno DeptName                             MgrNo  AdmrDept
------ ------------------------------------ ------ --------
A00    SPIFFY COMPUTER SERVICE DIV.         000010 A00
B01    PLANNING                             000020 A00
C01    INFORMATION CENTER                   000030 A00
D01    DEVELOPMENT CENTER                   NULL   A00
D11    MANUFACTURING SYSTEMS                000060 D01
D21    ADMINISTRATION SYSTEMS               000070 D01
E01    SUPPORT SERVICES                     000050 A00
E11    OPERATIONS                           000090 E01
E21    SOFTWARE SUPPORT                     000100 E01

(9 row(s) affected)

Employee info

  1. SELECT empno, firstnme, lastname, workdept
  2. FROM emps
  3. ORDER BY empno;
empno  firstnme     lastname        workdept
------ ------------ --------------- --------
000010 CHRISTINE    HAAS            A00
000020 MICHAEL      THOMPSON        NULL
000030 SALLY        KWAN            C01
000050 JOHN         GEYER           E01
000060 IRVING       STERN           D11
000070 EVA          PULASKI         D21
000090 EILEEN       HENDERSON       E11
000100 THEODORE     SPENSER         NULL
000110 VINCENZO     LUCCHESSI       A00
000120 SEAN         O CONNELL       A00
000130 DOLORES      QUINTANA        C01
000140 HEATHER      NICHOLLS        C01
000150 BRUCE        ADAMSON         NULL
000160 ELIZABETH    PIANKA          D11
000170 MASATOSHI    YOSHIMURA       D11
000180 MARILYN      SCOUTTEN        D11
000190 JAMES        WALKER          D11
000200 DAVID        BROWN           D11
000210 WILLIAM      JONES           D11
000220 JENNIFER     LUTZ            NULL
000230 JAMES        JEFFERSON       D21
000240 SALVATORE    MARINO          D21
000250 DANIEL       SMITH           D21
000260 SYBIL        JOHNSON         D21
000270 MARIA        PEREZ           D21
000280 ETHEL        SCHNEIDER       E11
000290 JOHN         PARKER          E11
000300 PHILIP       SMITH           E11
000310 MAUDE        SETRIGHT        E11
000320 RAMLAL       MEHTA           NULL
000330 WING         LEE             E21
000340 JASON        GOUNOT          E21

(32 row(s) affected)

4 employees have been hired, but they are not working yet, and don't yet have a department.

What's happening

  1. SELECT d.deptno, d.deptname, d.mgrno, e.empno, e.firstnme, e.lastname
  2. FROM department d, emps e
  3. WHERE d.deptno = e.workdept
  4. ORDER BY d.deptno, e.empno;
deptno deptname                             mgrno  empno  firstnme     lastname
------ ------------------------------------ ------ ------ ------------ ---------------
A00    SPIFFY COMPUTER SERVICE DIV.         000010 000010 CHRISTINE    HAAS
A00    SPIFFY COMPUTER SERVICE DIV.         000010 000110 VINCENZO     LUCCHESSI
A00    SPIFFY COMPUTER SERVICE DIV.         000010 000120 SEAN         O CONNELL
C01    INFORMATION CENTER                   000030 000030 SALLY        KWAN
C01    INFORMATION CENTER                   000030 000130 DOLORES      QUINTANA
C01    INFORMATION CENTER                   000030 000140 HEATHER      NICHOLLS
D11    MANUFACTURING SYSTEMS                000060 000060 IRVING       STERN
D11    MANUFACTURING SYSTEMS                000060 000160 ELIZABETH    PIANKA
D11    MANUFACTURING SYSTEMS                000060 000170 MASATOSHI    YOSHIMURA
D11    MANUFACTURING SYSTEMS                000060 000180 MARILYN      SCOUTTEN
D11    MANUFACTURING SYSTEMS                000060 000190 JAMES        WALKER
D11    MANUFACTURING SYSTEMS                000060 000200 DAVID        BROWN
D11    MANUFACTURING SYSTEMS                000060 000210 WILLIAM      JONES
D21    ADMINISTRATION SYSTEMS               000070 000070 EVA          PULASKI
D21    ADMINISTRATION SYSTEMS               000070 000230 JAMES        JEFFERSON
D21    ADMINISTRATION SYSTEMS               000070 000240 SALVATORE    MARINO
D21    ADMINISTRATION SYSTEMS               000070 000250 DANIEL       SMITH
D21    ADMINISTRATION SYSTEMS               000070 000260 SYBIL        JOHNSON
D21    ADMINISTRATION SYSTEMS               000070 000270 MARIA        PEREZ
E01    SUPPORT SERVICES                     000050 000050 JOHN         GEYER
E11    OPERATIONS                           000090 000090 EILEEN       HENDERSON
E11    OPERATIONS                           000090 000280 ETHEL        SCHNEIDER
E11    OPERATIONS                           000090 000290 JOHN         PARKER
E11    OPERATIONS                           000090 000300 PHILIP       SMITH
E11    OPERATIONS                           000090 000310 MAUDE        SETRIGHT
E21    SOFTWARE SUPPORT                     000100 000330 WING         LEE
E21    SOFTWARE SUPPORT                     000100 000340 JASON        GOUNOT

(27 row(s) affected)
  1. Departments: 9
  2. Employees: 32
  3. Employees with department: 27
  4. Employees without department: 5

What's there

What we are looking for are all the departments that does not have any working employee. MS SQL Server provides a very easy answer with the LEFT OUTER JOIN.

  • With MS SQL Server, the LEFT OUTER JOIN means: give me all the rows from the first table [the left] whether there is a child [the second table, the right] or NOT.
  • All the rows from the left table will be included.
  1. SELECT deptno, deptname, empno, firstnme, lastname
  2. FROM department LEFT outer join emps
  3. ON (deptno = workdept)
  4. ORDER BY deptno;
deptno deptname                             empno  firstnme     lastname
------ ------------------------------------ ------ ------------ ---------------
A00    SPIFFY COMPUTER SERVICE DIV.         000010 CHRISTINE    HAAS
A00    SPIFFY COMPUTER SERVICE DIV.         000110 VINCENZO     LUCCHESSI
A00    SPIFFY COMPUTER SERVICE DIV.         000120 SEAN         O CONNELL
B01    PLANNING                             NULL   NULL         NULL
C01    INFORMATION CENTER                   000030 SALLY        KWAN
C01    INFORMATION CENTER                   000130 DOLORES      QUINTANA
C01    INFORMATION CENTER                   000140 HEATHER      NICHOLLS
D01    DEVELOPMENT CENTER                   NULL   NULL         NULL
D11    MANUFACTURING SYSTEMS                000060 IRVING       STERN
D11    MANUFACTURING SYSTEMS                000160 ELIZABETH    PIANKA
D11    MANUFACTURING SYSTEMS                000170 MASATOSHI    YOSHIMURA
D11    MANUFACTURING SYSTEMS                000180 MARILYN      SCOUTTEN
D11    MANUFACTURING SYSTEMS                000190 JAMES        WALKER
D11    MANUFACTURING SYSTEMS                000200 DAVID        BROWN
D11    MANUFACTURING SYSTEMS                000210 WILLIAM      JONES
D21    ADMINISTRATION SYSTEMS               000070 EVA          PULASKI
D21    ADMINISTRATION SYSTEMS               000230 JAMES        JEFFERSON
D21    ADMINISTRATION SYSTEMS               000240 SALVATORE    MARINO
D21    ADMINISTRATION SYSTEMS               000250 DANIEL       SMITH
D21    ADMINISTRATION SYSTEMS               000260 SYBIL        JOHNSON
D21    ADMINISTRATION SYSTEMS               000270 MARIA        PEREZ
E01    SUPPORT SERVICES                     000050 JOHN         GEYER
E11    OPERATIONS                           000090 EILEEN       HENDERSON
E11    OPERATIONS                           000280 ETHEL        SCHNEIDER
E11    OPERATIONS                           000290 JOHN         PARKER
E11    OPERATIONS                           000300 PHILIP       SMITH
E11    OPERATIONS                           000310 MAUDE        SETRIGHT
E21    SOFTWARE SUPPORT                     000330 WING         LEE
E21    SOFTWARE SUPPORT                     000340 JASON        GOUNOT

(29 row(s) affected)
  • This includes B01 and D01 which have no employee assigned to them.

What's missing only

What we are looking for are only the departments that does not have any working employee. It's the same as the previous: What's there but with a where statement of null in the right.

  1. SELECT deptno, deptname
  2. FROM department LEFT outer join emps
  3. ON (deptno = workdept)
  4. WHERE empno IS null;
deptno deptname
------ ------------------------------------
B01    PLANNING
D01    DEVELOPMENT CENTER

(2 row(s) affected)

The key to finding what's missing is:

  1. The LEFT OUTER JOIN for linking the 2 tables.
  2. The IS NULL for finding out what is not in the child table.

This is often used for:

  • What are the customers we have not contacted in the last 3 month...
  • What are the employees that we does not have time sheet for...
  • What part is missing in this bill of material...