FULL OUTER JOIN – złączenie zewnętrzne pełne
Nie występuje w Apache Derby.
Teoria zbiorów
Oznaczmy zbiór z lewej jako A, a zbiór z prawej jako B.
W sensie teorii zbiorów jest to suma zbiorów A∪B.
Elementy wybrane employee.LastName | employee.DepartmentID | department.DepartmentID |
---|---|---|
Rafferty | 31 | 31 |
Jones, Heissenberg | 33 | 33 |
Robinson, Smith | 34 | 34 |
Williams | null | – |
– | – | 35 |
Klasa Java
package aderby.sqls.joins; import aderby.DerbyUtil; import java.sql.*; public class R125_FULL_OUTER_JOIN { private static final String baza = "C:/Przyklady/zatrudnieni_db"; static final String joinsql1 = "SELECT employee.LastName, employee.DepartmentID, " + "department.DepartmentName, department.DepartmentID FROM employee " + "INNER JOIN department ON employee.DepartmentID = department.DepartmentID " + "UNION ALL " + "SELECT employee.LastName, employee.DepartmentID, " + "cast(NULL as varchar(20)), cast(NULL as integer) FROM employee " + "WHERE NOT EXISTS (SELECT * FROM department " + "WHERE employee.DepartmentID = department.DepartmentID) " + "UNION ALL " + "SELECT cast(NULL as varchar(20)), cast(NULL as integer), " + "department.DepartmentName, department.DepartmentID FROM department " + "WHERE NOT EXISTS (SELECT * FROM employee " + "WHERE employee.DepartmentID = department.DepartmentID)"; static final String joinsql2 = "SELECT * FROM employee LEFT JOIN department ON " + "employee.DepartmentID = department.DepartmentID " + "UNION ALL " + "SELECT * FROM employee RIGHT OUTER JOIN department ON " + "employee.DepartmentID = department.DepartmentID WHERE employee.DepartmentID IS NULL"; public static void main(String[] args) { DerbyUtil.startDerbyEngine(DerbyUtil.embdriver); Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=false"); Statement stat = null; ResultSet rs = null; ResultSetMetaData rsmd; try { stat = con.createStatement(); rs = stat.executeQuery(joinsql1); rsmd = rs.getMetaData(); int cols = rsmd.getColumnCount(); while(rs.next()) { for(int i = 1; i <cols + 1; i++) { if(i<cols) { System.out.print(rs.getString(i) + ", "); } else{ System.out.print(rs.getString(i)); } } System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(rs); DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownEmbeddedDB(baza); DerbyUtil.shutdownDerbyEngine(); } }
Po uruchomieniu klasy na konsoli zobaczymy
Rafferty, 31, Sales, 31 Jones, 33, Engineering, 33 Heisenberg, 33, Engineering, 33 Robinson, 34, Clerical, 34 Smith, 34, Clerical, 34 Williams, null, null, null null, null, Marketing, 35
Pliki do ściągnięcia
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java
może być potrzebne skreślenie niepotrzebnych wpisów.