如何在oracle sql中连接具有不同记录数和列数的两个查询?
我有三张桌子:如何在oracle sql中连接具有不同记录数和列数的两个查询?,sql,database,oracle,join,oracle11g,Sql,Database,Oracle,Join,Oracle11g,我有三张桌子: Employee_leave(EmployeeID,Time_Period,leave_type) Employee(EID,Department,Designation) leave_eligibility(Department,Designation, LeaveType, LeavesBalance). 我想获取每个LeaveTypes(类别)中特定员工可用的假期数,因此我编写了以下查询Query1 SELECT LEAVE_TYPE, SUM(TIME
Employee_leave(EmployeeID,Time_Period,leave_type)
Employee(EID,Department,Designation)
leave_eligibility(Department,Designation, LeaveType, LeavesBalance).
我想获取每个LeaveTypes(类别)中特定员工可用的假期数,因此我编写了以下查询Query1
SELECT LEAVE_TYPE, SUM(TIME_PERIOD)
FROM EMPLOYEE_LEAVE
WHERE EMPLOYEEID=78
GROUP BY LEAVE_TYPE
order by leave_type;
查询1的输出
Leave_Type | SUM(Time_Period)
Casual 1
Paid 4
Sick 1
我想获取员工符合每种休假类型(类别)的休假次数。下面的查询查询2给出了所需的结果
Select UNIQUE Leavetype,LEAVEBALANCE
from LEAVE_ELIGIBILITY
INNER JOIN EMPLOYEE
ON LEAVE_ELIGIBILITY.DEPARTMENT= EMPLOYEE.DEPARTMENT
AND LEAVE_ELIGIBILITY.DESIGNATION= EMPLOYEE.DESIGNATION
WHERE EID=78
order by leavetype;
查询2的输出
LeaveType | LeaveBalance
Casual 10
Paid 15
Privlage 6
Sick 20
现在我想加入这两个查询Query1和Query2,或者创建一个视图来显示这两个查询中的记录。从输出中还可以看到,不同查询的记录数不同对于查询1的输出中不存在的记录,它应该在最终输出中显示0。就像在本例中,查询1的输出中没有类似privlage的记录,但它应该在最终输出privlage的Sum(time_period)中显示0。我尝试创建这两个查询的视图,然后合并它们,但无法运行最终查询
视图1的代码
create or replace view combo_table1 as
Select UNIQUE Leavetype,LEAVEBALANCE,EMPLOYEE.DEPARTMENT,EMPLOYEE.DESIGNATION, EID
from LEAVE_ELIGIBILITY
INNER JOIN EMPLOYEE
ON LEAVE_ELIGIBILITY.DEPARTMENT= EMPLOYEE.DEPARTMENT
AND LEAVE_ELIGIBILITY.DESIGNATION= EMPLOYEE.DESIGNATION
WHERE EID='78';
视图2的代码
create or replace view combo_table2 as
SELECT LEAVE_TYPE, SUM(TIME_PERIOD) AS Leave_Availed
FROM EMPLOYEE_LEAVE
WHERE EMPLOYEEID='78'
GROUP BY LEAVE_TYPE;
连接2个视图的代码
SELECT combo_table1.Leavetype, combo_table1.LEAVEBALANCE, combo_table2.leave_availed
FROM combo_table1 v1
INNER JOIN combo_table2 v2
ON v1.Leavetype = v2.LEAVE_TYPE;
但我在执行上述查询时得到“%s:无效标识符”。另外,我知道我不能使用union,因为它需要相同的列,而这里不是
我正在使用Oracle 11g,因此请相应地回答。
提前谢谢
期望的最终输出
LeaveType | LeaveBalance | Sum(Time_period)
Casual 10 1
Paid 15 4
Privlage 6 0
Sick 20 1
试试这个例子:
with t as (
select 'Casual' as Leave_Type, 1 as Time_Period, 0 as LeaveBalance from dual
union all
select 'Paid', 4,0 from dual
union all
select 'Sick', 1,0 from dual),
t1 as (
select 'Casual' as Leave_Type, 0 as Time_Period, 10 as LeaveBalance from dual
union all
select 'Paid', 0, 15 from dual
union all
select 'Privlage', 0, 6 from dual
union all
select 'Sick', 0, 20 from dual)
select Leave_Type, sum(Time_Period), sum(LeaveBalance)
from(
select *
from t
UNION ALL
select * from t1
)
group by Leave_Type
好的,编辑:
create or replace view combo_table1 as
Select UNIQUE Leavetype, 0 AS Leave_Availed, LEAVEBALANCE
from LEAVE_ELIGIBILITY INNER JOIN EMPLOYEE ON LEAVE_ELIGIBILITY.DEPARTMENT= EMPLOYEE.DEPARTMENT AND LEAVE_ELIGIBILITY.DESIGNATION= EMPLOYEE.DESIGNATION
WHERE EID='78';
create or replace view combo_table2 as
SELECT LEAVE_TYPE as Leavetype, SUM(TIME_PERIOD) AS Leave_Availed, 0 as LEAVEBALANCE
FROM EMPLOYEE_LEAVE
WHERE EMPLOYEEID='78'
GROUP BY LEAVE_TYPE, LEAVEBALANCE;
SELECT Leavetype, sum(LEAVEBALANCE), sum(leave_availed)
FROM (
select *
from combo_table1
UNION ALL
select * from combo_table2
)
group by Leavetype;
要获得最终所需的输出 对于查询1的输出中不存在的记录,它应在最终输出中显示0 。。。使用外部联接将休假记录绑定到其他表。对于员工未休的假期类型,这将为零
时间\持续时间
select emp.Employee_ID
, le.leavetype
, le.leavebalance
, sum (el.Time_Duration) as total_Time_Duration
from employee emp
inner join leave_eligibility le
on le.department= emp.department
and le.designation= emp.designation
left outer join Employee_leave el
on el.EmployeeID = emp.Employee_ID
and el.leave_type = le.leavetype
group by emp.Employee_ID
, le.leavetype
, le.leavebalance
;
你眼前的问题是:
我正在获取“%s:无效标识符”
您的视图引用了列EID
,尽管您发布的表中没有该名称的列。同样地,Time\u Duration
和Time\u period
之间也存在混淆
更一般地说,如果您在公共列中使用完全相同的名称,您会发现生活会变得更加轻松(即始终使用
employee\u id
或employeeid
,不要删改) 我不希望在最终输出中使用静态值。这些值应该来自2个查询的输出。