2017-10-17 147 views
1

後使用字母X這裏是我的查詢SQL子查詢和括號

SELECT deptno, 
    sum(distinct sal) as total_sal, 
    sum(bonus) as total_bonus 
FROM (
    SELECT e.empno, 
      e.ename, 
      e.sal, 
      e.deptno, 
      e.sal*case when eb.type is null then 0 
         when eb.type = 1 then .1 
         when eb.type = 2 then .2 
         else .3 end as bonus 
    FROM EMP e left outer join EMP_BONUS eb 
     on (e.empno = eb.empno) 
    WHERE e.deptno = 10 
    ) X <----------- if I don't use this I get an error 
GROUP BY deptno 

如果我省略了X,我得到一個錯誤說「附近關鍵字‘組’語法錯誤。任何人都可以解釋這樣做的目的「X」?

+0

它被稱爲表別名。一些數據庫要求它在'from'子句中用於子查詢。 –

回答

1

X是括號內的表「名稱」,這是內選擇查詢

也就是說,當你的數據來自一個子查詢,而不是一個命名錶的結果,你給它一個名字/別名。

(我假設這是從Case語句的外觀T-SQL)

+0

不知道爲什麼某些數據庫需要別名而其他數據庫不需要(例如Oracle)?我不知道,但很好奇。 –

+0

在不同平臺上遵守sql標準是非常模糊的,所以這只是數百個差異之一。也許sql標準甚至不涉及這種特殊情況。在一天結束時,人們通常不需要在不同的平臺上運行相同的SQL,因此它們無關緊要。與之相反,瀏覽器堅持JS和CSS標準有多重要。 – codeulike

2

它被稱爲表的別名,這是由一些數據庫所需的from子句中的子查詢。

更重要的是,您的查詢可能不會做您認爲正在做的事情。當部門的兩名僱員有相同的工資時,它會誤算總工資。

該查詢比看起來更復雜。試試這個:

select e.deptno, sum(e.sal), sum(e.sal * eb.bonus) 
from emp e left outer join 
    (select eb.empno, 
      sum(case when eb.type is null then 0.0 
         when eb.type = 1 then 0.1 
         when eb.type = 2 then 0.2 
         else 0.3 
       end) as bonus 
     from emp_bonus eb 
     group by eb.empno 
    ) db 
    on e.empno = eb.empno 
where e.deptno = 10 
+0

我在想着完全一樣的東西。在這個例子中,作者使用不同的薪水,所以我們不會遇到你提到的問題,但是謝謝指出。 – Adaptron