12

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)

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

4

2 に答える 2

21

はい、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

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

于 2011-02-09T01:47:22.160 に答える
0

あなたが持っているものに最も近い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;

しかし、それでも、クエリはあまり意味がありません。のレコードが2つ、のレコードがpubid=23つある場合pubid=4、出力には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;
于 2011-02-09T02:02:53.427 に答える