如何在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个查询的输出。