2015-12-22 118 views
1

一個查詢,該查詢應給出具有年份的輸出作爲該年度僱用的僱員的列名和編號。聘用日期將是他們在列hire_date。 我寫了代碼它像 SELECT count(e.employee_id) total, count(a.employee_id) _2002, count(b.employee_id) _2003, count(c.employee_id) _2004, count(d.employee_id) _2005 FROM hr.employees e, (select employee_id from hr.employees where extract(year from hire_date)=2002) a, (select employee_id from hr.employees where extract(year from hire_date)=2003) b, (select employee_id from hr.employees where extract(year from hire_date)=2004) c, (select employee_id from hr.employees where extract(year from hire_date)=2005) d;
它在每一列顯示'0'。我哪裏錯了?from from子句的集合函數

注意:所有條件都存在數據。

回答

1
  • 通過觀察你的代碼,您正在使用多個表中的FROM子句用逗號作爲分隔符這是一個隱CROSS JOIN返回行的笛卡爾積從表中加入。其結果是來自表A的行乘以來自表B的行,其中1:1匹配。如果每個表有10行並且有1:1的匹配,那麼結果將是100行(簡而言之,它將返回匹配的所有行from both tables)。在您的情況下,您的表列表中沒有匹配的行以使它們的行唯一的,這樣的結果顯然會對等於0

  • 或者WHERE子句/條件,你只需要使用case語句和聚合函數SUM,讓您預期的結果,而無需使用多個表或像這樣:

SELECT count(employee_id) total, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2002 THEN 1 ELSE 0 END) col_1999, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2003 THEN 1 ELSE 0 END) col_1998, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2004 THEN 1 ELSE 0 END) col_1997, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2005 THEN 1 ELSE 0 END) col_1996 
      FROM hr.employees ; 

請注意,在查詢中使用逗號分隔多個表(IMPLICT JOIN)仍然適用於ORACLE,但最好使用EXPLICIT JOIN。 Read this to know why it is better to use EXPLICIT than IMPLICIT JOIN

1

我利用狹縫不同的方法 SELECT count(employee_id) total, t1.a _2002, t2.b _2003, t3.c _2004, t4.d _2005 FROM hr.employees, (select count(employee_id) as a from hr.employees where extract(year from hire_date)=2002) t1, (select count(employee_id) as b from hr.employees where extract(year from hire_date)=2003) t2, (select count(employee_id) as c from hr.employees where extract(year from hire_date)=2004)t3, (select count(employee_id) as d from hr.employees where extract(year from hire_date)=2005) t4 group by t1.a , t2.b ,t3.c ,t4.d; 它給出了相同的答案得到的結果。但我想知道爲什麼問題 中的查詢不起作用。請給我理由。 謝謝。