2017-10-17 11 views
1

後に使用して文字のXは、ここで私は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」?

+0

テーブルエイリアスと呼ばれます。 'from'節でサブクエリのためにそれを必要とするデータベースもあります。 –

答えて

1

Xは、あなたのデータは、サブクエリではなく、指定したテーブルから来るとき、ある選択内部クエリ

の結果であり、括弧内のテーブルの「名前」で、あなたはにはがあり、名前/エイリアスとなります。

それはfrom句でサブクエリのためのいくつかのデータベースが必要とする表の別名、と呼ばれている

+0

あなたの頭の上から、特定のデータベースがエイリアスを必要としているのに、他のデータベースが別名を必要としている理由(Oracleなど)を知っていますか?私は知らないが、好奇心が強い。 –

+0

異なるプラットフォーム間でのSQL標準への準拠は非常に曖昧なので、これは数百の違いの1つに過ぎません。そして、おそらくSQL標準はこの特定のケースに対処していません。一日の終わりに、人々は頻繁に別のプラットフォーム上で同じSQLを実行する必要はありませんので、それほど重要ではありません。逆に、ブラウザーはJSとCSSの標準に準拠していることがどれほど重要であるかというと、 – codeulike

2

を(私はこれはそのCaseステートメントの外観から、T-SQLであると仮定しています)。

さらに重要なことは、あなたのクエリはおそらくあなたが思っていることをしていないことでしょう。部門内の2人の従業員が同じ給与を支払った場合、合計給与を誤って計算します。

クエリがそれよりもトリッキーです。これを代わりに試してください:

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