DEPARTMENTとEMPLOYEESのテーブルがあり、そこから社員のいない部署を取得しようとしているのですが、わたしの書いたSQLがうまく動きません。作動しない理由をご教授くだされば助かります。オラクル8.1.7.4.1で動作させなければならず、left outer joinが使えないところからの質問です。
データはこういう構造です(*がプライマリーキィを表す)。
DEPARTMENT: *DEPT__T, DEPT_NAME, ....
EMPLOYEES: *EMPLOYEES__T, DEPT_NAME, ...
これに対して、
select dept__t,
(select count(*) from employee where department.dept__t = employees.dept__t) counter
from department
where counter = 0
というSQLで社員のいない部署を取ろうとしたのですが、ORA-00904: "COUNTER": invalid identifier.が返されてしまいます。
WHERE文にcounterというエイリアスではなくカラムそのものを書くと問合せが正常に作動するのですが、なぜでしょうか。オラクルのバージョンが古いことが原因でしょうか。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
ただ純粋なエラーの原因を探しているのでしたら
SQL リファレンスマニュアルのSELECT文に別名に関する記述があります。
--- 引用 ---
c_alias
列式の別名を指定します。
この別名は、結果セットの列のヘッダーで使用されます。
...中略...
問合せにおいて、別名はorder_by_clause で使用できますが、
他の句では使用できません。
---
これは 10g の仕様です。標準SQLについてはわかりません。
この回答への補足
>ただ純粋なエラーの原因を探している・・・
質問の趣旨はその通りです。
ご示唆いただいたSQL リファレンスマニュアルを読みこんだところ、SQL文は
FROM
WHERE
GROUP BY
HAVING
SELECT
UNION
ORDER BY
の順で解釈されると読み取れる記述を見つけました。わたしのSQLではSELECT句で宣言されたエイリアスをWHERE句で比較するよう要求しているので、データベースがまだ定義されていないエイリアスは解釈できないとしてオラクルエラーを出しているのではないかというのがわたしの独自にたどり着いた結論です。
この理解でよいのかだけ最後に確認させてください。
No.4
- 回答日時:
別名は、データの抽出後に使用します。
データベースからwhereの条件に合うものを
メモリ上におきます。
そこで項目に名前をつけるときに
別名指定があれば、別名をつけます。
データ抽出時点で別名は認識していません。
そのあとにorderby指定があればソートします。
ですので、orderbyでは別名を使用できます。
大まかには、こういった感じのようです。
(細かい部分は間違ってるかも・・・)
No.3
- 回答日時:
exists ( select ~) や in ( select ~)
を使えない理由でもあるのですか?
No.2
- 回答日時:
select department.dept__t,
count(employees.dept__t)
from department,employee
where department.dept__t = employees.dept__t(+)
group by department.dept__t
having count(employees.dept__t) =0
上記のように書き換えれば動きます。
こちらのほうがスマートではないでしょうか?
また上記のエイリアスでのwhere文(where counter = 0)は
オラクルの後のバージョンでもエラーになります。
(+)がouter joinと同じ意味なのですね。お教えくださりありがとうございます。さらにエイリアスがエラーになる理由をお願いできませんでしょうか。これまでにもなんどとなくエイリアスでエラーを出しては、別のSQLを書いて切り抜けてきたのですが、原因を理解するところまでは力が及ばずにいます。
No.1
- 回答日時:
select dept__t,
(select count(*) from employee where department.dept__t = employees.dept__t) "counter"
from department
where counter = 0
という具合に、ダブルコ-ティーションで囲ってください。
( counter => "counter" )
この回答への補足
エイリアスの定義を"counter"としても同じエラーが出ます。 as "counter", as counterでもトライしましたが同じ結果です。お手数をかけますが、このオラクルエラーの意味を教えていただけませんでしょうか。
補足日時:2006/04/11 15:14お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracleで「文字が無効です」の...
-
2つの列が同じ値の行を取得するSQL
-
[materialized]マテリアライズ...
-
同じテーブルからviewを作成し...
-
【PL/SQL】FROM区に変数を使う方法
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
where句中のtrim関数について
-
count関数の値をwhere句で使用...
-
SQLです下記の問合せを行うクエ...
-
データ
-
並べ替えについて
-
SQLで条件にヒットしたレコード...
-
group byの並び順を変えるだけ...
-
BLOB型項目をSQLの検索条件に指...
-
テーブルのフィールドの一番長...
-
2回実行のSQL文を1回にしたい
-
ハイフンの入ったデータの並べ替え
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つの列が同じ値の行を取得するSQL
-
Oracleで「文字が無効です」の...
-
PL/SQLで…SQLの実行結果を変数...
-
枝番の最大値とその前のデータ...
-
並び替えた後の表の結合
-
同じテーブルからviewを作成し...
-
UPDATE文のWHERE句にファンクシ...
-
最新かつ最大の値を求める
-
Accessオプションボタン vba case
-
Oracleでビット演算はできますか?
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
count関数の値をwhere句で使用...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
レコードの登録順がおかしい
-
<SQL>重複しているデータの場合...
-
AccessのSQL文で1件のみヒット...
おすすめ情報