连接 Oracle 中没有公共列的两个表

Join two tables without a common column in Oracle

我有两个 tables -

员工:

EmployeeNo | EmployeeName | EmployeeDesignation | CompanyID 
12345      | ABC          | Doctor              | 3434
4545       | XYZ          | Engineer            | 3434

部门:

DepartmentNo | EmployeeNo | Location
0808         | 12345      | Loc1
0989         | 12345      | Loc2

我想打印员工详细信息以及部门中的位置计数 table。输出应该是这样的 -

EmployeeNo| EmployeeName| EmployeeDesignation| Count(Location)
12345     | ABC         | Doctor             | 2
4545      | XYZ         | Engineer           |

当我使用内部联接时,它显示的是 employeeId 12345 而不是 4545 的详细信息。我知道是这样,因为部门 Table 的相应 EmployeeNo 列中没有 4545 的数据。我知道我们可以使用交叉连接来组合没有公共列的 table,但它在计数列中给了我一个垃圾数字。

我的内连接查询 -


select Employee.EmployeeNo, Employee.EmployeeName, Employee.EmployeeDesignation, count(Department.Location) as count
from Employee inner join Department on
Employee.EmployeeNo = Department.EmployeeNo
where Employee.CompanyID like '3434'
group by Employee.EmployeeNo, Employee.EmployeeName, Employee.EmployeeDesignation

我的交叉连接查询

select Employee.EmployeeNo, Employee.EmployeeName, Employee.EmployeeDesignation, count(Department.Location) as count
from Employee, Department
where Employee.CompanyID like '3434'
group by Employee.EmployeeNo, Employee.EmployeeName, Employee.EmployeeDesignation

使用 LEFT OUTER JOIN:

SELECT e.EmployeeNo,
       e.EmployeeName,
       e.EmployeeDesignation,
       COUNT(d.Location) as count
FROM   Employee e
       LEFT OUTER JOIN Department d
       ON (e.EmployeeNo = d.EmployeeNo)
WHERE  e.CompanyID like '3434'
GROUP BY
       e.EmployeeNo,
       e.EmployeeName,
       e.EmployeeDesignation

其中,对于示例数据:

CREATE TABLE Employee (
  EmployeeNo PRIMARY KEY,
  EmployeeName,
  EmployeeDesignation,
  CompanyID
) AS
SELECT 12345, 'ABC', 'Doctor',   3434 FROM DUAL UNION ALL
SELECT 4545,  'XYZ', 'Engineer', 3434 FROM DUAL;

CREATE TABLE Department (
  DepartmentNo PRIMARY KEY,
  EmployeeNo,
  Location
) AS
SELECT '0808', 12345, 'Loc1' FROM DUAL UNION ALL
SELECT '0989', 12345, 'Loc2' FROM DUAL;

ALTER TABLE Department ADD CONSTRAINT department__employeeno__fk
  FOREIGN KEY (EmployeeNo) REFERENCES Employee(EmployeeNo);

输出:

EMPLOYEENO EMPLOYEENAME EMPLOYEEDESIGNATION COUNT
4545 XYZ Engineer 0
12345 ABC Doctor 2

此外,如果 EmployeeNo 是主键,那么您不需要在 GROUP BY 子句中包含 non-primary 键列,并且可以聚合以获取这些列:

SELECT e.EmployeeNo,
       MAX(e.EmployeeName) AS EmployeeName,
       MAX(e.EmployeeDesignation) AS EmployeeDesignation,
       COUNT(d.Location) as count
FROM   Employee e
       LEFT OUTER JOIN Department d
       ON (e.EmployeeNo = d.EmployeeNo)
WHERE  e.CompanyID like '3434'
GROUP BY
       e.EmployeeNo

db<>fiddle here