web-dev-qa-db-ja.com

oracle:from句にエイリアスを割り当てることはできますか?

from句にエイリアスを割り当てることはできますか?お気に入り:

select a - b "Markup" from retail a, cost b;

編集:申し訳ありませんが、私はそれを少し速すぎて入力し、それが意味をなさないところまで質問を単純化しようとしました

私が実際にやろうとしているのは、エイリアスを使用して、同じテーブル内の2つの公開日の間の月を比較することです。これが私がうまくいくと思ったものです:

select distinct to_char(months_between((select distinct pubdate
                                        from books3 
                                        where pubid = 2), 
                                       (select distinct pubdate 
                                        from books3 
                                        where pubid = 4)), '99.99') "Answer"
                              from books3

私はそれをこのように見せたかった:

select distinct months_between(a,b)
from (select distinct pubdate 
       from books3 
       where pubid = 2 as a), 
     (select distinct pubdate 
      from books3 
      where pubid = 4 as b)

しかし、それは機能していません

9
Sinaesthetic

はい、Oracleはテーブルエイリアスをサポートしています。 ASリストではSELECTをサポートしますが、FROMリストではサポートしません。

SELECT a.col - b.col AS markup
  FROM RETAIL a,
       COST b
 WHERE b.id = a.id

ほとんどのデータベースは、ASキーワードの省略をサポートしています。

とはいえ、テーブルエイリアスは列エイリアスではありません。例の更新で見られるように、SELECT句でそれぞれのテーブルの特定の列を参照する必要があります。また、クエリがデカルト積を返さないように、WHERE基準を追加しました。

派生テーブル/インラインビューにはテーブルエイリアスが必要になる場合があります(用語は非常にあいまいですが、別名サブクエリ)。

SELECT x.col
  FROM (SELECT t.col,
               MAX(t.date)
          FROM TABLE t
      GROUP BY t.col) x

クエリは次のとおりです。

問題は、角かっこ/括弧の外側にある必要があるときに、派生テーブル内にテーブルエイリアスを配置していたことでした。

SELECT DISTINCT TO_CHAR(MONTHS_BETWEEN(x.pubdate, y.pubdate), '99.99') AS "Answer"
 FROM (SELECT DISTINCT a.pubdate FROM BOOKS3 a WHERE a.pubid = 2) x,
      (SELECT DISTINCT b.pubdate FROM BOOKS3 b WHERE b.pubid = 4) y

明確なものが必要な理由は、デカルト積のためです。

15
OMG Ponies

あなたが持っているものに最も近いのは、サブクエリからAS aliasを移動することです

select distinct months_between(a.pubdate,b.pubdate)
from (select distinct pubdate 
       from books3 
       where pubid = 2) as a ,
     (select distinct pubdate 
      from books3 
      where pubid = 4) as b;

しかし、それでも、クエリはあまり意味がありません。 pubid=2に2つのレコードがあり、pubid=4に3つのレコードがある場合、出力に6行が含まれます。

months_between(a1, b1)
months_between(a2, b1)
months_between(a1, b2)
months_between(a2, b2)
months_between(a1, b3)
months_between(a2, b3)

実際にいくつかのグループ化が行われていると思われるので、これにより、bookidごとのレベルでpubid = 2とpubid = 4のエントリが比較されます。

select
    bookid,
    to_char(months_between(
        max(case when pubid=2 then pubdate end),
        max(case when pubid=4 then pubdate end)), '99.99') "Answer"
from books
group by bookid;
0
RichardTheKiwi