- 締切済み
SQL副問い合わせ内のエイリアス
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というエイリアスではなくカラムそのものを書くと問合せが正常に作動するのですが、なぜでしょうか。オラクルのバージョンが古いことが原因でしょうか。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- MZ-80B
- ベストアンサー率56% (46/81)
- X-trail_00
- ベストアンサー率30% (438/1430)
- MZ-80B
- ベストアンサー率56% (46/81)
- X-trail_00
- ベストアンサー率30% (438/1430)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
関連するQ&A
- sqlのテーブル名省略について
内部SQLで使用している「employee」表を「emp」とし、内部SQL実行結果を「emp」としています。 この場合、大外のSQLで使用している「emp」は、「emploheeを指すemp」か、「内部SQL実行結果を指すemp」なのかわかりません。 ご教授よろしくお願いします。 select emp.name, emp.year, emp.day from (select name, year, day from employee emp where ~ GROUP BY name, year, day) emp where ~ GROUP BY emp.name, emp.year, emp.da /
- ベストアンサー
- Oracle
- SQL SERVER
ORACLEの以下のようなテーブルの結合の構文を SQL SERVERでするとどのような構文になるのでしょうか? SELECT T1.T_CODE, T2.T_CODE, T2,F_NAME FROM TEST1 T1, TEST2 T2 WHERE T1.T_CODE = T2T_CODE(+)
- ベストアンサー
- SQL Server
- SQL-Server 6.5で最初の数行を抽出するには?
SQL-Server 6.5で最初の数行を抽出するにはどのようにすればよろしいでしょうか? Oracleの場合、 SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10; JETの場合、 SELECT TOP 10 * FROM TABLE_NAME; ですが、これをSQL-Serverで行う場合をご教授下さい。
- 締切済み
- その他(データベース)
- PHP SQL 問合せについて
PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。
- 締切済み
- PHP
- PL/SQLでのSQL文法
こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。
- ベストアンサー
- その他(データベース)
- INSERT文の副問合わせで*は使えますか?
ORACLE sqlPlusでの話ですが 例えば、 deptno, dname, loc この三つの属性を持つ、dept表、dept_copy表があったとして INSERT INTO dept_copy SELECT * FROM dept WHERE deptno = 10; このような文は通りますか? CREATE TABLE文ではこのような * を利用してもエラーにはならないはずなのですが。
- ベストアンサー
- Oracle
- SQLの書き方
SQLの書き方 SQL初心者なのですが、わからないことがあるので教えてください。 表Employees (EmployeeID,EmployeeName) 表Salary (PayDate,Amount,EmployeeID) という2つの表があるときに、次の問題があります。 問題:表Employeesから各EmployeeIDについて、SalaryのAmountの最高が300,000以上のデータを取り出し、EmployeeID,EmployeeName,Amountの最高額を表示しなさい。 答えが SELECT EmployeeID ,EmployeeName ,( SELECT MAX(Amount) FROM Salary WHERE EmployeeID=Employees.EmployeeID /*GROUP BY EmployeeID*/ ) FROM Employees WHERE EmployeeID IN ( SELECT EmployeeID FROM Salary GROUP BY EmployeeID HAVING MAX(Amount)>=300,000 ) ; となるのですが、/*と*/の間の文がいらないのはなぜですか?選択リストの中の副問い合わせで、MAX(Amount)というのがあるのでグループ化しなければならないと思うのですが、よくわかりません。
- ベストアンサー
- SQL Server
- WITH句を使用したSQLの結果
WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;
- 締切済み
- Oracle
- Access2007でSQLの複数列副問い合わせについて
VB2005+Access2007を使用しております SQL文の複数列副問い合わせについて教えて下さい 検索をしても他のデータベースのものばかりヒットし、解決できません SELECT * FROM Uriage WHERE (Date, DateID) = (SELECT Date, DateID FROM Uriage WHERE NAME = 'cup') これを実行すると 「メイン クエリの FROM 句の予約語 EXISTS を使用しないフィールド を複数返すサブクエリを作成しました。サブクエリのSELECT ステート メントを変更し、1 つのフィールドだけを指定してください。」 というエラーがでてしまいます。 形をかえ、 SELECT * FROM Uriage WHERE Date = (SELECT Date FROM UriageList WHERE NAME = 'cup') AND DateID =(SELECT DateID FROM UriageList WHERE NAME = 'cup') これを実行すると、 「このサブクエリでは 1 つのレコードしか返せません。」 というエラーがでてしまいます。 また、 SELECT * FROM Uriage WHERE (Date) IN (SELECT Date FROM UriageList WHERE NAME = 'cup') AND (DateID) IN (SELECT DateID FROM UriageList WHERE NAME = 'cup') を実行したところ、 エラーはでないものの、抽出結果が異なるものが出てきてしまいました。 これを解決するにはどのようにしたらよいのでしょうか? よろしくお願いいたします。 なお、某知恵袋にも同様の質問をしてしまいましたが、 回答者様への回答や追加質問が出来ず、 こちらに再質問させて頂きました。申し訳ございません。
- ベストアンサー
- その他(データベース)
- EXSIST述語を使った副問合わせについて
SELECT HINMOKU_NAME FROM HINMOKU WHERE HINMOKU_CODE IN (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE = '2004-11-10'); 上記をSQL文をEXISTS述語を使って書き換えると エラーが出てしまい、うまく書き換えがすることが できません。下記にエラーがでるSQL文を記載いたします。 SELECT HINMOKU_NAME FROM HINMOKU WHERE EXISTS (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE ='2004-11-10' WHERE HINMOKU.HINMOKU_CODE=URIAGE.HINMOKU_CODE); 上記SQL文についてどこに問題があるのか、ご教授お願い致します。
- ベストアンサー
- SQL Server
- マカフィー詐欺被害に遭い、クレジットカードで支払いをしてしまいました。ウィルス感染の可能性が心配で、インストールはしていませんが、何度か「Yes」を押しました。詐欺の見分け方を教えてください。
- マカフィー詐欺に引っかかり、クレジットカードで支払った被害があります。今後のウィルス感染のリスクが心配で、インストールはしていないが「Yes」ボタンを押してしまいました。詐欺の特徴を教えてください。
- マカフィー詐欺に遭ってしまい、クレジットカードで支払いをしてしまいました。ウィルス感染の可能性を心配しており、インストールはしていないが何度か「Yes」を押してしまいました。詐欺の見極め方を教えてください。
補足
>ただ純粋なエラーの原因を探している・・・ 質問の趣旨はその通りです。 ご示唆いただいたSQL リファレンスマニュアルを読みこんだところ、SQL文は FROM WHERE GROUP BY HAVING SELECT UNION ORDER BY の順で解釈されると読み取れる記述を見つけました。わたしのSQLではSELECT句で宣言されたエイリアスをWHERE句で比較するよう要求しているので、データベースがまだ定義されていないエイリアスは解釈できないとしてオラクルエラーを出しているのではないかというのがわたしの独自にたどり着いた結論です。 この理解でよいのかだけ最後に確認させてください。