The FULL JOIN is often described as combining the LEFT JOIN and RIGHT JOIN operations. It returns all records from the left and right tables. Those records not satisfying the JOIN criteria are represented by NULLS. This join can be useful in instances where it is important to understand membership in both directions. In other words, to determine which records are in the left table but not in the right table, which records are in the right table but not in the left table, and which records are in both. You may be thinking, “when will I possibly need this?” That’s a very good question. Let’s examine a real-world problem and then explore why, when using this join type to retrieve data and subsequently report on it, extra caution is required.
The data used throughout the examples on this page and captured in the two tables below can be found at livesql.oracle.com.
Employees
The employees table contains one row per employee.
| employee_id | first_name | last_name | phone_number | hire_date | job_id | salary | commission_pct | manager_id | department_id | |
|---|---|---|---|---|---|---|---|---|---|---|
| 100 | Steven | King | SKING | 515.123.4567 | 17-Jun-03 | AD_PRES | 24000 | – | – | 90 |
| 101 | Neena | Kochhar | NKOCHHAR | 515.123.4568 | 21-Sep-05 | AD_VP | 17000 | – | 100 | 90 |
| 102 | Lex | De Haan | LDEHAAN | 515.123.4569 | 13-Jan-01 | AD_VP | 17000 | – | 100 | 90 |
| 103 | Alexander | Hunold | AHUNOLD | 590.423.4567 | 3-Jan-06 | IT_PROG | 9000 | – | 102 | 60 |
| 104 | Bruce | Ernst | BERNST | 590.423.4568 | 21-May-07 | IT_PROG | 6000 | – | 103 | 60 |
| 105 | David | Austin | DAUSTIN | 590.423.4569 | 25-Jun-05 | IT_PROG | 4800 | – | 103 | 60 |
| 106 | Valli | Pataballa | VPATABAL | 590.423.4560 | 5-Feb-06 | IT_PROG | 4800 | – | 103 | 60 |
| 107 | Diana | Lorentz | DLORENTZ | 590.423.5567 | 7-Feb-07 | IT_PROG | 4200 | – | 103 | 60 |
| 108 | Nancy | Greenberg | NGREENBE | 515.124.4569 | 17-Aug-02 | FI_MGR | 12008 | – | 101 | 100 |
| 109 | Daniel | Faviet | DFAVIET | 515.124.4169 | 16-Aug-02 | FI_ACCOUNT | 9000 | – | 108 | 100 |
| 110 | John | Chen | JCHEN | 515.124.4269 | 28-Sep-05 | FI_ACCOUNT | 8200 | – | 108 | 100 |
| 111 | Ismael | Sciarra | ISCIARRA | 515.124.4369 | 30-Sep-05 | FI_ACCOUNT | 7700 | – | 108 | 100 |
| 112 | Jose Manuel | Urman | JMURMAN | 515.124.4469 | 7-Mar-06 | FI_ACCOUNT | 7800 | – | 108 | 100 |
| 113 | Luis | Popp | LPOPP | 515.124.4567 | 7-Dec-07 | FI_ACCOUNT | 6900 | – | 108 | 100 |
| 114 | Den | Raphaely | DRAPHEAL | 515.127.4561 | 7-Dec-02 | PU_MAN | 11000 | – | 100 | 30 |
| 115 | Alexander | Khoo | AKHOO | 515.127.4562 | 18-May-03 | PU_CLERK | 3100 | – | 114 | 30 |
| 116 | Shelli | Baida | SBAIDA | 515.127.4563 | 24-Dec-05 | PU_CLERK | 2900 | – | 114 | 30 |
| 117 | Sigal | Tobias | STOBIAS | 515.127.4564 | 24-Jul-05 | PU_CLERK | 2800 | – | 114 | 30 |
| 118 | Guy | Himuro | GHIMURO | 515.127.4565 | 15-Nov-06 | PU_CLERK | 2600 | – | 114 | 30 |
| 119 | Karen | Colmenares | KCOLMENA | 515.127.4566 | 10-Aug-07 | PU_CLERK | 2500 | – | 114 | 30 |
| 120 | Matthew | Weiss | MWEISS | 650.123.1234 | 18-Jul-04 | ST_MAN | 8000 | – | 100 | 50 |
| 121 | Adam | Fripp | AFRIPP | 650.123.2234 | 10-Apr-05 | ST_MAN | 8200 | – | 100 | 50 |
| 122 | Payam | Kaufling | PKAUFLIN | 650.123.3234 | 1-May-03 | ST_MAN | 7900 | – | 100 | 50 |
| 123 | Shanta | Vollman | SVOLLMAN | 650.123.4234 | 10-Oct-05 | ST_MAN | 6500 | – | 100 | 50 |
| 124 | Kevin | Mourgos | KMOURGOS | 650.123.5234 | 16-Nov-07 | ST_MAN | 5800 | – | 100 | 50 |
| 125 | Julia | Nayer | JNAYER | 650.124.1214 | 16-Jul-05 | ST_CLERK | 3200 | – | 120 | 50 |
| 126 | Irene | Mikkilineni | IMIKKILI | 650.124.1224 | 28-Sep-06 | ST_CLERK | 2700 | – | 120 | 50 |
| 127 | James | Landry | JLANDRY | 650.124.1334 | 14-Jan-07 | ST_CLERK | 2400 | – | 120 | 50 |
| 128 | Steven | Markle | SMARKLE | 650.124.1434 | 8-Mar-08 | ST_CLERK | 2200 | – | 120 | 50 |
| 129 | Laura | Bissot | LBISSOT | 650.124.5234 | 20-Aug-05 | ST_CLERK | 3300 | – | 121 | 50 |
| 130 | Mozhe | Atkinson | MATKINSO | 650.124.6234 | 30-Oct-05 | ST_CLERK | 2800 | – | 121 | 50 |
| 131 | James | Marlow | JAMRLOW | 650.124.7234 | 16-Feb-05 | ST_CLERK | 2500 | – | 121 | 50 |
| 132 | TJ | Olson | TJOLSON | 650.124.8234 | 10-Apr-07 | ST_CLERK | 2100 | – | 121 | 50 |
| 133 | Jason | Mallin | JMALLIN | 650.127.1934 | 14-Jun-04 | ST_CLERK | 3300 | – | 122 | 50 |
| 134 | Michael | Rogers | MROGERS | 650.127.1834 | 26-Aug-06 | ST_CLERK | 2900 | – | 122 | 50 |
| 135 | Ki | Gee | KGEE | 650.127.1734 | 12-Dec-07 | ST_CLERK | 2400 | – | 122 | 50 |
| 136 | Hazel | Philtanker | HPHILTAN | 650.127.1634 | 6-Feb-08 | ST_CLERK | 2200 | – | 122 | 50 |
| 137 | Renske | Ladwig | RLADWIG | 650.121.1234 | 14-Jul-03 | ST_CLERK | 3600 | – | 123 | 50 |
| 138 | Stephen | Stiles | SSTILES | 650.121.2034 | 26-Oct-05 | ST_CLERK | 3200 | – | 123 | 50 |
| 139 | John | Seo | JSEO | 650.121.2019 | 12-Feb-06 | ST_CLERK | 2700 | – | 123 | 50 |
| 140 | Joshua | Patel | JPATEL | 650.121.1834 | 6-Apr-06 | ST_CLERK | 2500 | – | 123 | 50 |
| 141 | Trenna | Rajs | TRAJS | 650.121.8009 | 17-Oct-03 | ST_CLERK | 3500 | – | 124 | 50 |
| 142 | Curtis | Davies | CDAVIES | 650.121.2994 | 29-Jan-05 | ST_CLERK | 3100 | – | 124 | 50 |
| 143 | Randall | Matos | RMATOS | 650.121.2874 | 15-Mar-06 | ST_CLERK | 2600 | – | 124 | 50 |
| 144 | Peter | Vargas | PVARGAS | 650.121.2004 | 9-Jul-06 | ST_CLERK | 2500 | – | 124 | 50 |
| 145 | John | Russell | JRUSSEL | 011.44.1344.429268 | 1-Oct-04 | SA_MAN | 14000 | 0.4 | 100 | 80 |
| 146 | Karen | Partners | KPARTNER | 011.44.1344.467268 | 5-Jan-05 | SA_MAN | 13500 | 0.3 | 100 | 80 |
| 147 | Alberto | Errazuriz | AERRAZUR | 011.44.1344.429278 | 10-Mar-05 | SA_MAN | 12000 | 0.3 | 100 | 80 |
| 148 | Gerald | Cambrault | GCAMBRAU | 011.44.1344.619268 | 15-Oct-07 | SA_MAN | 11000 | 0.3 | 100 | 80 |
| 149 | Eleni | Zlotkey | EZLOTKEY | 011.44.1344.429018 | 29-Jan-08 | SA_MAN | 10500 | 0.2 | 100 | 80 |
| 150 | Peter | Tucker | PTUCKER | 011.44.1344.129268 | 30-Jan-05 | SA_REP | 10000 | 0.3 | 145 | 80 |
| 151 | David | Bernstein | DBERNSTE | 011.44.1344.345268 | 24-Mar-05 | SA_REP | 9500 | 0.25 | 145 | 80 |
| 152 | Peter | Hall | PHALL | 011.44.1344.478968 | 20-Aug-05 | SA_REP | 9000 | 0.25 | 145 | 80 |
| 153 | Christopher | Olsen | COLSEN | 011.44.1344.498718 | 30-Mar-06 | SA_REP | 8000 | 0.2 | 145 | 80 |
| 154 | Nanette | Cambrault | NCAMBRAU | 011.44.1344.987668 | 9-Dec-06 | SA_REP | 7500 | 0.2 | 145 | 80 |
| 155 | Oliver | Tuvault | OTUVAULT | 011.44.1344.486508 | 23-Nov-07 | SA_REP | 7000 | 0.15 | 145 | 80 |
| 156 | Janette | King | JKING | 011.44.1345.429268 | 30-Jan-04 | SA_REP | 10000 | 0.35 | 146 | 80 |
| 157 | Patrick | Sully | PSULLY | 011.44.1345.929268 | 4-Mar-04 | SA_REP | 9500 | 0.35 | 146 | 80 |
| 158 | Allan | McEwen | AMCEWEN | 011.44.1345.829268 | 1-Aug-04 | SA_REP | 9000 | 0.35 | 146 | 80 |
| 159 | Lindsey | Smith | LSMITH | 011.44.1345.729268 | 10-Mar-05 | SA_REP | 8000 | 0.3 | 146 | 80 |
| 160 | Louise | Doran | LDORAN | 011.44.1345.629268 | 15-Dec-05 | SA_REP | 7500 | 0.3 | 146 | 80 |
| 161 | Sarath | Sewall | SSEWALL | 011.44.1345.529268 | 3-Nov-06 | SA_REP | 7000 | 0.25 | 146 | 80 |
| 162 | Clara | Vishney | CVISHNEY | 011.44.1346.129268 | 11-Nov-05 | SA_REP | 10500 | 0.25 | 147 | 80 |
| 163 | Danielle | Greene | DGREENE | 011.44.1346.229268 | 19-Mar-07 | SA_REP | 9500 | 0.15 | 147 | 80 |
| 164 | Mattea | Marvins | MMARVINS | 011.44.1346.329268 | 24-Jan-08 | SA_REP | 7200 | 0.1 | 147 | 80 |
| 165 | David | Lee | DLEE | 011.44.1346.529268 | 23-Feb-08 | SA_REP | 6800 | 0.1 | 147 | 80 |
| 166 | Sundar | Ande | SANDE | 011.44.1346.629268 | 24-Mar-08 | SA_REP | 6400 | 0.1 | 147 | 80 |
| 167 | Amit | Banda | ABANDA | 011.44.1346.729268 | 21-Apr-08 | SA_REP | 6200 | 0.1 | 147 | 80 |
| 168 | Lisa | Ozer | LOZER | 011.44.1343.929268 | 11-Mar-05 | SA_REP | 11500 | 0.25 | 148 | 80 |
| 169 | Harrison | Bloom | HBLOOM | 011.44.1343.829268 | 23-Mar-06 | SA_REP | 10000 | 0.2 | 148 | 80 |
| 170 | Tayler | Fox | TFOX | 011.44.1343.729268 | 24-Jan-06 | SA_REP | 9600 | 0.2 | 148 | 80 |
| 171 | William | Smith | WSMITH | 011.44.1343.629268 | 23-Feb-07 | SA_REP | 7400 | 0.15 | 148 | 80 |
| 172 | Elizabeth | Bates | EBATES | 011.44.1343.529268 | 24-Mar-07 | SA_REP | 7300 | 0.15 | 148 | 80 |
| 173 | Sundita | Kumar | SKUMAR | 011.44.1343.329268 | 21-Apr-08 | SA_REP | 6100 | 0.1 | 148 | 80 |
| 174 | Ellen | Abel | EABEL | 011.44.1644.429267 | 11-May-04 | SA_REP | 11000 | 0.3 | 149 | 80 |
| 175 | Alyssa | Hutton | AHUTTON | 011.44.1644.429266 | 19-Mar-05 | SA_REP | 8800 | 0.25 | 149 | 80 |
| 176 | Jonathon | Taylor | JTAYLOR | 011.44.1644.429265 | 24-Mar-06 | SA_REP | 8600 | 0.2 | 149 | 80 |
| 177 | Jack | Livingston | JLIVINGS | 011.44.1644.429264 | 23-Apr-06 | SA_REP | 8400 | 0.2 | 149 | 80 |
| 178 | Kimberely | Grant | KGRANT | 011.44.1644.429263 | 24-May-07 | SA_REP | 7000 | 0.15 | 149 | – |
| 179 | Charles | Johnson | CJOHNSON | 011.44.1644.429262 | 4-Jan-08 | SA_REP | 6200 | 0.1 | 149 | 80 |
| 180 | Winston | Taylor | WTAYLOR | 650.507.9876 | 24-Jan-06 | SH_CLERK | 3200 | – | 120 | 50 |
| 181 | Jean | Fleaur | JFLEAUR | 650.507.9877 | 23-Feb-06 | SH_CLERK | 3100 | – | 120 | 50 |
| 182 | Martha | Sullivan | MSULLIVA | 650.507.9878 | 21-Jun-07 | SH_CLERK | 2500 | – | 120 | 50 |
| 183 | Girard | Geoni | GGEONI | 650.507.9879 | 3-Feb-08 | SH_CLERK | 2800 | – | 120 | 50 |
| 184 | Nandita | Sarchand | NSARCHAN | 650.509.1876 | 27-Jan-04 | SH_CLERK | 4200 | – | 121 | 50 |
| 185 | Alexis | Bull | ABULL | 650.509.2876 | 20-Feb-05 | SH_CLERK | 4100 | – | 121 | 50 |
| 186 | Julia | Dellinger | JDELLING | 650.509.3876 | 24-Jun-06 | SH_CLERK | 3400 | – | 121 | 50 |
| 187 | Anthony | Cabrio | ACABRIO | 650.509.4876 | 7-Feb-07 | SH_CLERK | 3000 | – | 121 | 50 |
| 188 | Kelly | Chung | KCHUNG | 650.505.1876 | 14-Jun-05 | SH_CLERK | 3800 | – | 122 | 50 |
| 189 | Jennifer | Dilly | JDILLY | 650.505.2876 | 13-Aug-05 | SH_CLERK | 3600 | – | 122 | 50 |
| 190 | Timothy | Gates | TGATES | 650.505.3876 | 11-Jul-06 | SH_CLERK | 2900 | – | 122 | 50 |
| 191 | Randall | Perkins | RPERKINS | 650.505.4876 | 19-Dec-07 | SH_CLERK | 2500 | – | 122 | 50 |
| 192 | Sarah | Bell | SBELL | 650.501.1876 | 4-Feb-04 | SH_CLERK | 4000 | – | 123 | 50 |
| 193 | Britney | Everett | BEVERETT | 650.501.2876 | 3-Mar-05 | SH_CLERK | 3900 | – | 123 | 50 |
| 194 | Samuel | McCain | SMCCAIN | 650.501.3876 | 1-Jul-06 | SH_CLERK | 3200 | – | 123 | 50 |
| 195 | Vance | Jones | VJONES | 650.501.4876 | 17-Mar-07 | SH_CLERK | 2800 | – | 123 | 50 |
| 196 | Alana | Walsh | AWALSH | 650.507.9811 | 24-Apr-06 | SH_CLERK | 3100 | – | 124 | 50 |
| 197 | Kevin | Feeney | KFEENEY | 650.507.9822 | 23-May-06 | SH_CLERK | 3000 | – | 124 | 50 |
| 198 | Donald | OConnell | DOCONNEL | 650.507.9833 | 21-Jun-07 | SH_CLERK | 2600 | – | 124 | 50 |
| 199 | Douglas | Grant | DGRANT | 650.507.9844 | 13-Jan-08 | SH_CLERK | 2600 | – | 124 | 50 |
| 200 | Jennifer | Whalen | JWHALEN | 515.123.4444 | 17-Sep-03 | AD_ASST | 4400 | – | 101 | 10 |
| 201 | Michael | Hartstein | MHARTSTE | 515.123.5555 | 17-Feb-04 | MK_MAN | 13000 | – | 100 | 20 |
| 202 | Pat | Fay | PFAY | 603.123.6666 | 17-Aug-05 | MK_REP | 6000 | – | 201 | 20 |
| 203 | Susan | Mavris | SMAVRIS | 515.123.7777 | 7-Jun-02 | HR_REP | 6500 | – | 101 | 40 |
| 204 | Hermann | Baer | HBAER | 515.123.8888 | 7-Jun-02 | PR_REP | 10000 | – | 101 | 70 |
| 205 | Shelley | Higgins | SHIGGINS | 515.123.8080 | 7-Jun-02 | AC_MGR | 12008 | – | 101 | 110 |
| 206 | William | Gietz | WGIETZ | 515.123.8181 | 7-Jun-02 | AC_ACCOUNT | 8300 | – | 205 | 110 |
Departments
The departments table contains one row per department.
| department_id | department_name | manager_id | location_id |
|---|---|---|---|
| 10 | Administration | 200 | 1700 |
| 20 | Marketing | 201 | 1800 |
| 30 | Purchasing | 114 | 1700 |
| 40 | Human Resources | 203 | 2400 |
| 50 | Shipping | 121 | 1500 |
| 60 | IT | 103 | 1400 |
| 70 | Public Relations | 204 | 2700 |
| 80 | Sales | 145 | 2500 |
| 90 | Executive | 100 | 1700 |
| 100 | Finance | 108 | 1700 |
| 110 | Accounting | 205 | 1700 |
| 120 | Treasury | – | 1700 |
| 130 | Corporate Tax | – | 1700 |
| 140 | Control And Credit | – | 1700 |
| 150 | Shareholder Services | – | 1700 |
| 160 | Benefits | – | 1700 |
| 170 | Manufacturing | – | 1700 |
| 180 | Construction | – | 1700 |
| 190 | Contracting | – | 1700 |
| 200 | Operations | – | 1700 |
| 210 | IT Support | – | 1700 |
| 220 | NOC | – | 1700 |
| 230 | IT Helpdesk | – | 1700 |
| 240 | Government Sales | – | 1700 |
| 250 | Retail Sales | – | 1700 |
| 260 | Recruiting | – | 1700 |
| 270 | Payroll | – | 1700 |
Real-world Problem
Suppose you work at a company and you’ve been requested to generate a report for management with a focus on understanding each department and the employees within them. A key requirement of this report is that every department and employee are represented in the report. As a result, management will be able to review records of employees currently working in a department, records of employees not currently assigned to a department, and those departments without any employees (i.e., a vacant department). This is clearly a job for the FULL JOIN.
Below is the code required to generate this report and the corresponding result set or content of the report. For the purposes of this example, only a subset of attributes from the employees and departments tables have been used.
-- Generate report for management containing all employees and departments.
SELECT
hr.employees.employee_id,
hr.employees.hire_date,
hr.employees.department_id,
hr.departments.department_name,
hr.employees.job_id,
hr.employees.salary,
hr.employees.commission_pct,
hr.employees.manager_id
FROM
hr.employees
FULL JOIN
hr.departments
ON hr.employees.department_id = hr.departments.department_id
ORDER BY
hr.employees.employee_id;
| employee_id | hire_date | department_id | department_name | job_id | salary | commission_pct | manager_id |
|---|---|---|---|---|---|---|---|
| 100 | 17-Jun-03 | 90 | Executive | AD_PRES | 24000 | – | – |
| 101 | 21-Sep-05 | 90 | Executive | AD_VP | 17000 | – | 100 |
| 102 | 13-Jan-01 | 90 | Executive | AD_VP | 17000 | – | 100 |
| 103 | 3-Jan-06 | 60 | IT | IT_PROG | 9000 | – | 102 |
| 104 | 21-May-07 | 60 | IT | IT_PROG | 6000 | – | 103 |
| 105 | 25-Jun-05 | 60 | IT | IT_PROG | 4800 | – | 103 |
| 106 | 5-Feb-06 | 60 | IT | IT_PROG | 4800 | – | 103 |
| 107 | 7-Feb-07 | 60 | IT | IT_PROG | 4200 | – | 103 |
| 108 | 17-Aug-02 | 100 | Finance | FI_MGR | 12008 | – | 101 |
| 109 | 16-Aug-02 | 100 | Finance | FI_ACCOUNT | 9000 | – | 108 |
| 110 | 28-Sep-05 | 100 | Finance | FI_ACCOUNT | 8200 | – | 108 |
| 111 | 30-Sep-05 | 100 | Finance | FI_ACCOUNT | 7700 | – | 108 |
| 112 | 7-Mar-06 | 100 | Finance | FI_ACCOUNT | 7800 | – | 108 |
| 113 | 7-Dec-07 | 100 | Finance | FI_ACCOUNT | 6900 | – | 108 |
| 114 | 7-Dec-02 | 30 | Purchasing | PU_MAN | 11000 | – | 100 |
| 115 | 18-May-03 | 30 | Purchasing | PU_CLERK | 3100 | – | 114 |
| 116 | 24-Dec-05 | 30 | Purchasing | PU_CLERK | 2900 | – | 114 |
| 117 | 24-Jul-05 | 30 | Purchasing | PU_CLERK | 2800 | – | 114 |
| 118 | 15-Nov-06 | 30 | Purchasing | PU_CLERK | 2600 | – | 114 |
| 119 | 10-Aug-07 | 30 | Purchasing | PU_CLERK | 2500 | – | 114 |
| 120 | 18-Jul-04 | 50 | Shipping | ST_MAN | 8000 | – | 100 |
| 121 | 10-Apr-05 | 50 | Shipping | ST_MAN | 8200 | – | 100 |
| 122 | 1-May-03 | 50 | Shipping | ST_MAN | 7900 | – | 100 |
| 123 | 10-Oct-05 | 50 | Shipping | ST_MAN | 6500 | – | 100 |
| 124 | 16-Nov-07 | 50 | Shipping | ST_MAN | 5800 | – | 100 |
| 125 | 16-Jul-05 | 50 | Shipping | ST_CLERK | 3200 | – | 120 |
| 126 | 28-Sep-06 | 50 | Shipping | ST_CLERK | 2700 | – | 120 |
| 127 | 14-Jan-07 | 50 | Shipping | ST_CLERK | 2400 | – | 120 |
| 128 | 8-Mar-08 | 50 | Shipping | ST_CLERK | 2200 | – | 120 |
| 129 | 20-Aug-05 | 50 | Shipping | ST_CLERK | 3300 | – | 121 |
| 130 | 30-Oct-05 | 50 | Shipping | ST_CLERK | 2800 | – | 121 |
| 131 | 16-Feb-05 | 50 | Shipping | ST_CLERK | 2500 | – | 121 |
| 132 | 10-Apr-07 | 50 | Shipping | ST_CLERK | 2100 | – | 121 |
| 133 | 14-Jun-04 | 50 | Shipping | ST_CLERK | 3300 | – | 122 |
| 134 | 26-Aug-06 | 50 | Shipping | ST_CLERK | 2900 | – | 122 |
| 135 | 12-Dec-07 | 50 | Shipping | ST_CLERK | 2400 | – | 122 |
| 136 | 6-Feb-08 | 50 | Shipping | ST_CLERK | 2200 | – | 122 |
| 137 | 14-Jul-03 | 50 | Shipping | ST_CLERK | 3600 | – | 123 |
| 138 | 26-Oct-05 | 50 | Shipping | ST_CLERK | 3200 | – | 123 |
| 139 | 12-Feb-06 | 50 | Shipping | ST_CLERK | 2700 | – | 123 |
| 140 | 6-Apr-06 | 50 | Shipping | ST_CLERK | 2500 | – | 123 |
| 141 | 17-Oct-03 | 50 | Shipping | ST_CLERK | 3500 | – | 124 |
| 142 | 29-Jan-05 | 50 | Shipping | ST_CLERK | 3100 | – | 124 |
| 143 | 15-Mar-06 | 50 | Shipping | ST_CLERK | 2600 | – | 124 |
| 144 | 9-Jul-06 | 50 | Shipping | ST_CLERK | 2500 | – | 124 |
| 145 | 1-Oct-04 | 80 | Sales | SA_MAN | 14000 | 0.4 | 100 |
| 146 | 5-Jan-05 | 80 | Sales | SA_MAN | 13500 | 0.3 | 100 |
| 147 | 10-Mar-05 | 80 | Sales | SA_MAN | 12000 | 0.3 | 100 |
| 148 | 15-Oct-07 | 80 | Sales | SA_MAN | 11000 | 0.3 | 100 |
| 149 | 29-Jan-08 | 80 | Sales | SA_MAN | 10500 | 0.2 | 100 |
| 150 | 30-Jan-05 | 80 | Sales | SA_REP | 10000 | 0.3 | 145 |
| 151 | 24-Mar-05 | 80 | Sales | SA_REP | 9500 | 0.25 | 145 |
| 152 | 20-Aug-05 | 80 | Sales | SA_REP | 9000 | 0.25 | 145 |
| 153 | 30-Mar-06 | 80 | Sales | SA_REP | 8000 | 0.2 | 145 |
| 154 | 9-Dec-06 | 80 | Sales | SA_REP | 7500 | 0.2 | 145 |
| 155 | 23-Nov-07 | 80 | Sales | SA_REP | 7000 | 0.15 | 145 |
| 156 | 30-Jan-04 | 80 | Sales | SA_REP | 10000 | 0.35 | 146 |
| 157 | 4-Mar-04 | 80 | Sales | SA_REP | 9500 | 0.35 | 146 |
| 158 | 1-Aug-04 | 80 | Sales | SA_REP | 9000 | 0.35 | 146 |
| 159 | 10-Mar-05 | 80 | Sales | SA_REP | 8000 | 0.3 | 146 |
| 160 | 15-Dec-05 | 80 | Sales | SA_REP | 7500 | 0.3 | 146 |
| 161 | 3-Nov-06 | 80 | Sales | SA_REP | 7000 | 0.25 | 146 |
| 162 | 11-Nov-05 | 80 | Sales | SA_REP | 10500 | 0.25 | 147 |
| 163 | 19-Mar-07 | 80 | Sales | SA_REP | 9500 | 0.15 | 147 |
| 164 | 24-Jan-08 | 80 | Sales | SA_REP | 7200 | 0.1 | 147 |
| 165 | 23-Feb-08 | 80 | Sales | SA_REP | 6800 | 0.1 | 147 |
| 166 | 24-Mar-08 | 80 | Sales | SA_REP | 6400 | 0.1 | 147 |
| 167 | 21-Apr-08 | 80 | Sales | SA_REP | 6200 | 0.1 | 147 |
| 168 | 11-Mar-05 | 80 | Sales | SA_REP | 11500 | 0.25 | 148 |
| 169 | 23-Mar-06 | 80 | Sales | SA_REP | 10000 | 0.2 | 148 |
| 170 | 24-Jan-06 | 80 | Sales | SA_REP | 9600 | 0.2 | 148 |
| 171 | 23-Feb-07 | 80 | Sales | SA_REP | 7400 | 0.15 | 148 |
| 172 | 24-Mar-07 | 80 | Sales | SA_REP | 7300 | 0.15 | 148 |
| 173 | 21-Apr-08 | 80 | Sales | SA_REP | 6100 | 0.1 | 148 |
| 174 | 11-May-04 | 80 | Sales | SA_REP | 11000 | 0.3 | 149 |
| 175 | 19-Mar-05 | 80 | Sales | SA_REP | 8800 | 0.25 | 149 |
| 176 | 24-Mar-06 | 80 | Sales | SA_REP | 8600 | 0.2 | 149 |
| 177 | 23-Apr-06 | 80 | Sales | SA_REP | 8400 | 0.2 | 149 |
| 178 | 24-May-07 | – | – | SA_REP | 7000 | 0.15 | 149 |
| 179 | 4-Jan-08 | 80 | Sales | SA_REP | 6200 | 0.1 | 149 |
| 180 | 24-Jan-06 | 50 | Shipping | SH_CLERK | 3200 | – | 120 |
| 181 | 23-Feb-06 | 50 | Shipping | SH_CLERK | 3100 | – | 120 |
| 182 | 21-Jun-07 | 50 | Shipping | SH_CLERK | 2500 | – | 120 |
| 183 | 3-Feb-08 | 50 | Shipping | SH_CLERK | 2800 | – | 120 |
| 184 | 27-Jan-04 | 50 | Shipping | SH_CLERK | 4200 | – | 121 |
| 185 | 20-Feb-05 | 50 | Shipping | SH_CLERK | 4100 | – | 121 |
| 186 | 24-Jun-06 | 50 | Shipping | SH_CLERK | 3400 | – | 121 |
| 187 | 7-Feb-07 | 50 | Shipping | SH_CLERK | 3000 | – | 121 |
| 188 | 14-Jun-05 | 50 | Shipping | SH_CLERK | 3800 | – | 122 |
| 189 | 13-Aug-05 | 50 | Shipping | SH_CLERK | 3600 | – | 122 |
| 190 | 11-Jul-06 | 50 | Shipping | SH_CLERK | 2900 | – | 122 |
| 191 | 19-Dec-07 | 50 | Shipping | SH_CLERK | 2500 | – | 122 |
| 192 | 4-Feb-04 | 50 | Shipping | SH_CLERK | 4000 | – | 123 |
| 193 | 3-Mar-05 | 50 | Shipping | SH_CLERK | 3900 | – | 123 |
| 194 | 1-Jul-06 | 50 | Shipping | SH_CLERK | 3200 | – | 123 |
| 195 | 17-Mar-07 | 50 | Shipping | SH_CLERK | 2800 | – | 123 |
| 196 | 24-Apr-06 | 50 | Shipping | SH_CLERK | 3100 | – | 124 |
| 197 | 23-May-06 | 50 | Shipping | SH_CLERK | 3000 | – | 124 |
| 198 | 21-Jun-07 | 50 | Shipping | SH_CLERK | 2600 | – | 124 |
| 199 | 13-Jan-08 | 50 | Shipping | SH_CLERK | 2600 | – | 124 |
| 200 | 17-Sep-03 | 10 | Administration | AD_ASST | 4400 | – | 101 |
| 201 | 17-Feb-04 | 20 | Marketing | MK_MAN | 13000 | – | 100 |
| 202 | 17-Aug-05 | 20 | Marketing | MK_REP | 6000 | – | 201 |
| 203 | 7-Jun-02 | 40 | Human Resources | HR_REP | 6500 | – | 101 |
| 204 | 7-Jun-02 | 70 | Public Relations | PR_REP | 10000 | – | 101 |
| 205 | 7-Jun-02 | 110 | Accounting | AC_MGR | 12008 | – | 101 |
| 206 | 7-Jun-02 | 110 | Accounting | AC_ACCOUNT | 8300 | – | 205 |
| – | – | – | Shareholder Services | – | – | – | – |
| – | – | – | IT Helpdesk | – | – | – | – |
| – | – | – | Corporate Tax | – | – | – | – |
| – | – | – | Manufacturing | – | – | – | – |
| – | – | – | Treasury | – | – | – | – |
| – | – | – | NOC | – | – | – | – |
| – | – | – | Control And Credit | – | – | – | – |
| – | – | – | Recruiting | – | – | – | – |
| – | – | – | Contracting | – | – | – | – |
| – | – | – | Retail Sales | – | – | – | – |
| – | – | – | Government Sales | – | – | – | – |
| – | – | – | Construction | – | – | – | – |
| – | – | – | Payroll | – | – | – | – |
| – | – | – | Operations | – | – | – | – |
| – | – | – | Benefits | – | – | – | – |
| – | – | – | IT Support | – | – | – | – |
Notice, within the first 107 records, 106 employees are actively assigned to a department, as indicated by the department attributes being populated. Employee 178 is not currently assigned to a department. Following those 107 records, there exists 16 records representing the vacant departments (e.g., Recruiting, Treasuring, etc.). These facts are the result of the ON clause where the condition is to evaluate whether the department ID populated in the employee record can be found within the departments table and/or the department ID populated in the department record can be found within the employees table. With the output of the query, the reporting requirements have been fulfilled.
A Tale of Caution
Developing reports and/or dashboards using result sets generated, in whole or in part, by a FULL JOIN require additional attention to detail. For example, using the result set above, how many employees are there? The correct answer is 107; however, a typically safe method of computing this value will return an incorrect value of 123. See the query below where the importance of understanding the difference between COUNT(*) and COUNT(schema.table.column_name) is critical to reporting accuracy.
-- The query returns 123 but the correct number of employees is 107.
WITH report AS (
SELECT
hr.employees.employee_id,
hr.employees.hire_date,
hr.employees.department_id,
hr.departments.department_name,
hr.employees.job_id,
hr.employees.salary,
COALESCE(hr.employees.commission_pct, 0) AS commission_percentage,
hr.employees.manager_id
FROM
hr.employees
FULL JOIN
hr.departments
ON hr.employees.department_id = hr.departments.department_id
)
SELECT
COUNT(*) AS employee_count
FROM
report;
Reporting and visualization tools, such as Tableau and Power BI can make the same error without additional input from the user specifying to ignore those records with unpopulated employee ID values.
The potential issues with reporting on data generated by a FULL JOIN do not only include instances where counts are computed. It’s potentially an issue when computing any type of aggregation. Imagine that all employees should have a commission percentage value populated and you’ve taken the extra step of replacing missing employee commission percentage values with zero for the users of your report. Subsequently, you or a user of your report computes an average of the commission percentage values using the query below or a popular reporting tool, such as Tableau or Power BI. The average commission percentage will be dragged down due to the rows in the report representing vacant departments. Instead of returning a value of 0.22, the value returned will be 0.06.
-- Compute the average employee commission percentage across all employees.
WITH report AS (
SELECT
hr.employees.employee_id,
hr.employees.hire_date,
hr.employees.department_id,
hr.departments.department_name,
hr.employees.job_id,
hr.employees.salary,
COALESCE(hr.employees.commission_pct, 0) AS commission_percentage,
hr.employees.manager_id
FROM
hr.employees
FULL JOIN
hr.departments
ON hr.employees.department_id = hr.departments.department_id
)
SELECT
ROUND(
AVG(report.commission_percentage),
2
) AS commission_percentage
FROM
report;
The examples and ideas captured above are not intended to convey an anti-FULL JOIN position or stance, but serve to simply educate on things that can go wrong, resulting in inaccurate data reported, when we are not careful.
Knowledge Check
If you’d like to confirm your understanding on JOINS and other fundamental concepts, consider solving a handful of my practice problems here.