• ベストアンサー

PL/SQLのコード

DBの中のVIEWにこのようなコードがありました。 SELECT AAA, BBB, MAX(CCC) AS CCC FROM TABLE SELECTのなかにある’MAX(CCC) AS CCC’という部分が 分りません。関数なのでしょうか、本で調べてみたのですが のっていませんでした。 どなたか分る方はいませんでしょうか。 宜しくお願い致します.

質問者が選んだベストアンサー

  • ベストアンサー
  • takasgy
  • ベストアンサー率42% (30/71)
回答No.2

Haizyさんのおっしゃる通り、MAX(CCC)をCCCという列名とする指定です。 値を集計したものや、今回のように最大値を関数を使用して取得した場合にテーブルやビューを検索するときに使用します。 また、テーブルを複数組み合わせて使用する場合にも便利です。 たとえば、、 テーブル Table_A 列 aaa bbb ccc テーブル Table_B 列 aaa bbb ccc dddd Table_AとTable_Bを結合して検索したい場合、 select A.aaa as aaa, A.bbb as bbb, A.ccc as ccc, B.ddd as ddd from Table_A A, /* Table_A をAという別名にする */ Table_B B, /* Table_B をBという別名にする */ where A.aaa = B.aaa and A.bbb = B.bbb and A.ccc = B.ccc; aaa, bbb, cccはどちらのテーブルの列を使用するか明示しないとエラーになります。 でも、これがビューで作成されていてA.aaaなんて指定をして検索するのはイヤですよね。 また、よく英字で短縮した名称を使用している場合もありますが。 select aaa as 伝票番号, bbb as 明細番号 form Table_C とかするとわかりやすいですよ。 別名がちゃんと指定されていればビューで使用している列が変更されても問題が発生しない場合もあります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.3

補足に対する回答です。 >MAX()とは関数でしょうか? はい、関数です。 select条件にかかったものの最大値を返します。 この場合CCC列の最大値ですね。 ※逆に、min()関数というのもあります。 参考になれば。 でわ

全文を見る
すると、全ての回答が全文表示されます。
  • Haizy
  • ベストアンサー率40% (404/988)
回答No.1

こんにちは。 MAX(CCC) を CCC という列名前にする。 でしょう。 MAX(CCC) のままだと、その他のSQL文から、そのVIEWの値を呼び出したい時に「列名指定」が困るからです。 自信はありませんが、参考になれば。 でわ

saruno
質問者

補足

ありがとうございます。 もうひとつ質問なのですが、 MAX()とは関数でしょうか? すいませんお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLのこと:distinctして並び替えたい

    select * from (select distinct on (aaa) * from bbb) as ccc order by ddd テーブルbbbのaaaというフィールドが重複せず、しかも他のフィールドで並び替えをしたかったら、このような書き方以外ありますか?データベースはPostgreSQLです。 この書き方で不都合が出ているというわけではありませんが、どう書けば、パフォーマンス的にも良いSQLになるか、詳しい方がいらっしゃいましたら、お願いします。

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

  • PL/SQL での[CURSOR]の記述について

    CURSORを使用する際に、以下のようなことが実現できるものか分からないもので、 ご質問させていただきました。 以下のような記述で、where条件を別の変数(wk_where)に格納しておいて、 それを連結させることが可能なのかお教えいただきたいです。 もしも可能であればどのように連結させるのでしょうか? CURSOR cur出力データ IS SELECT AAA, BBB FROM AAAテーブル ; イメージとしては以下のように考えていました。 CURSOR cur出力データ IS SELECT AAA, BBB FROM AAAテーブル & wk_where ; 以上ですが、宜しくおねがいいたします。

  • SQLについて

    SQLについてわからないのでご教授ください。 TABLE AAA コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 bbb 20100601 99999999 ccc 20100101 20110711 ccc 20110712 99999999 TABLE BBB コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 ccc 20100101 20110711 ・テーブルBBBの適用終了日が'99999999'のコードは テーブルAAAでは適用終了日が'99999999'の1レコードのみ。 ・テーブルBBBの適用終了日が'20100531'などの'99999999'以外は テーブルAAAでは適用終了日が'20100531'のレコードと、翌日'20100601'が適用開始日に設定され '99999999'が適用終了日に設定されたレコードの2レコードが存在。 上記2つが正常の状態です。 これらの条件に反する異常を検知するようなSQLを作りたいです。 たとえば、テーブルAAAのレコード[bbb 20100601 99999999]がない場合、 実行結果としてコード「bbb」が出力されるようなSQLが欲しいです。 異常がなければ、「なにも選択されませんでした。」でよいです。 条件として、 ・テーブルAAAでは「コード」「適用開始日」がPK ・テーブルAAAでは同じコードの「適用開始日」「適用終了日」の期間がかぶることはない ・テーブルAAAでは同じコードで3レコード以上は存在しない   (たとえば20100101~20100531、20100601~20100931、20101001~20101231の3つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。

  • オラクルSQL文のCOUNT関数について

    SELECT COUNT (*) AS XXXX FROM AAA,BBB WHERE AAA.AAA = BBB.BBB AND ・・・・ ・・・・ やりたい事は、AAAテーブルだけのカウントをしたいのですが 現状、BBBのカウントもしてしまいます。 BBBはWHEREでAAAに対して比較だけを 行いたいのですが、この場合どうやったらいいのでしょうか。

  • SQLで他のテーブルに無いIDの抽出

    MySQLを使っています。 下記は、 1.テーブルaaaには、存在するidのものが、 2.テーブルbbbには、存在しない、 3.テーブルaaaのレコードを抽出したいものです。 "SELECT DISTINCT aaa.*" + " FROM aaa" + " WHERE (aaa.flag = false)" + " AND NOT EXISTS (SELECT * FROM bbb" + " WHERE (aaa.id = bbb.id) AND (bbb.flag = false))" ですが、実行すると、下記エラーがでます。 SQLException:Base table or view not found, message from server: \"Unknown table 'bbb' in where clause" どうすればよいのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL文の書き方

    SQL文の書き方を教えて下さい。 以下の2つのクエリー(1のクエリー&2のクエリー)を1つのクエリーで1度に抽出をかけたいのですがSQL文の書き方がわかりません。 データの発生条件としては TableBのField1は必ずTableAのField1に存在するという条件です。 TableAのField1が「AAA」から「EEE」まである場合は、TableBのField1も必ず「AAA」から「EEE」の範囲内で発生します。 よろしくお願い致します。 1のクエリー ---------------------------------------------------------------- TableA Field1 ---------------------------------------------------------------- AAA AAA AAA BBB BBB CCC DDD DDD EEE EEE EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableA.Field1) as RecCount, TableA.Field1 From TableA 結果 RecCount  Field1 3      AAA 2      BBB 1      CCC 2      DDD 3      EEE ---------------------------------------------------------------- 2のクエリー ---------------------------------------------------------------- TableB Field1 ---------------------------------------------------------------- BBB CCC CCC EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableB.Field1) as RecCount, TableB.Field1 From TableB 結果 RecCount  Field1 1      BBB 2      CCC 1      EEE ---------------------------------------------------------------- 希望する結果 TableAのRecCount TableBのRecCount TableAのField1 3                   AAA 2         1         BBB 1         2         CCC 2                   DDD 3         1         EEE

  • SQLでご助言いただきたく。

    テーブル名:AAA カラム: 'fname' ,ename テーブル名:BBB カラム: "id",fcode テーブル名:CCC カラム : "id",'fname',date 上記三つのテーブルAAA,BBB,CCCにそれぞれカラムがあります。 最終的に ename fcode date の3カラムを結合した状態でSELECTします。 ただし、条件として AAAのfname列とCCCのfname列を紐付けし、尚且つ BBBのid列とCCCのid列を紐付けし、尚且つ CCCのdate列が2012-10-31以上のものだけをSELECTしたいです。 上記を踏まえて下記二点ご質問致します。 (1)私が考えたSQL文は select a.ename ,bc.fcode ,bc.date from AAA a , (select b.fcode ,c.fname ,c.date from BBB b , CCC c where b.id = c.id and c.date >= '2012-10-31' ) bc where a.fname = bc.fname ; です。先にBBBとCCCから紐付けしその結果とAAAを紐付けしています。 このSQL文で間違いがないかどうか判定していただきたく。 (2)もっとスマートな書き方(短く書けるなど)がありましたら、 ご助言いただきたく。 ちなみにデータベースはオラクル仕様です。 宜しくお願い致します。

  • SQLで件数分SELECT結果を取得するには

    SQLSERVERのSQLで以下の【期待する結果】を取得する方法はありますか? SELECT NAME,COUNT FROM CLASSROOM 【結果】 AAA,2 BBB,1 CCC,3 【期待する結果】 AAA AAA BBB CCC CCC CCC よろしくお願いします。

  • すっきりとしたSQL文にしたいのですが

    Oracle9iにてテーブルのデータを更新しようと思っています。 目的としてはAAAのカラムa1とBBBのカラムb1が同一なレコードである場合、 AAAのa2にBBBのb2を更新したいのですが、 <条件> AAA:テーブル1 BBB:テーブル2 a1:CHAR b1:CHAR a2:VERCHAR b2:VERCHAR すべて必須で桁数は10 UPDATE AAA SET AAA.a2 = ( SELECT BBB.b2 FROM BBB WHERE AAA.a1 = BBB.b1) WHERE AAA.a1 = ( SELECT BBB.b1 FROM BBB WHERE AAA.a1 = BBB.b1) ; いまはこんな無駄の多そうなSQLしか分かりません。 この他にも条件が2つ追加される予定なので もっとすっきり更新できる方法を教えていただけませんでしょうか? よろしくお願いします。

このQ&Aのポイント
  • 給湯器のトラブルでお湯が出なくなった場合、タイトルは「給湯器トラブルでお湯が出ない!どうすればいい??」などとすると良いでしょう。
  • 給湯器のトラブルによりお湯が出なくなった場合、家賃の支払いや費用について問題が生じます。この場合、管理会社に相談し、家賃の交渉や費用の補償を依頼することができます。
  • 給湯器のトラブルでお湯が出なくなった場合、温水器の設置までの間はIHやバケツを使用して身体を洗うことができます。しかし、家賃の支払いについては管理会社との交渉が必要です。
回答を見る