• 締切済み

結合した表のグルーピングに関して

前回3つ以上のテーブルの結合に関しての続きです。 お手数ですが再度アドバイスお願いします。 select * from テーブル1 x,テーブル2 y,テーブル3 z where x.店舗コード=y.店舗コード(+) and x.店舗コード=z.店舗コード(+) and x.店舗コード in (選択したい店舗のカンマ区切りのリスト) この結果を実行したのですが どうやら店舗コードが複数行(実際には2行)抽出されてしまいました。 そこでgrpup句を使用してみましたがエラーになってしまいました。 結合ではグループ化はできないのでしょうか? 大変お手数ですが対処法を教えて頂けますでしょうか。 また、補足でお願いできましたら 上記のSQL句の(+)とは何を意味しているのでしょうか? 私の所有している参考書の結合の箇所には そういった記述がありませんでした。 お手数ですがよろしくお願いします。

みんなの回答

回答No.2

(+)は、今回の場合だと ・「テーブル1 x」のレコードは全部出す。 ・他のテーブルの列は「テーブル1 x」に 紐付くデータをくっつけて表示 ・もしも紐付くデータが無い時はNULLを表示という意味です。 ↓にコピペでそのまま動作する結合のgroup byを用意したので 参考にして下さい。 --------------------------------- with a as( select '001' as ID,1 as SAL from dual union all select '002',2 from dual union all select '003',3 from dual union all select '004',4 from dual ), b as ( select '001' as ID,1 as SAL from dual union all select '001',1 from dual union all select '003',3 from dual union all select '005',5 from dual ) --↓ここから重要 select b.ID,b.SAL from a,b where a.ID(+) = b.ID group by b.ID,b.SAL;

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

結合後のGROUP BY句でも、文法が正しければ使用できます。 エラーになったSQLを提示してもらわないと、これ以上はなにも言えません。 (+)の表記は、外結合を表します。(+)を付加しない場合は、内結合になります。 参考書は、なにを使用されているのでしょうか? ORACLEに特化したものであれば、記載があると思いますが、 標準SQL規格には含まれていないので、 汎用的な参考書だと記載されていないかもしれません。 あえて、(+)のような表記を使わず 「LEFT OUTER JOIN」、「INNER JOIN」のような標準SQLでの 記述と、それぞれの意味を勉強された方が良いかと思います。

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

関連するQ&A

  • 表の結合について

    現在、資格の勉強をしており、その中のSQLについて 分からないことがあります。  作業表((P)作業コード、作業名称) 工数見積表((P)担当者コード、(P)作業コード、見積時間) 作業日程表((P)担当者コード、(P)作業コード、(P)作業年月日、作業時間) (P) は 主キーです。  1つの表に(P)が複数あるときは、すべてあわせて主キーです。 という3つの表をwhere句で結合したいのですが、 問題集の回答にはこのように書いてありました。  (where 句のところだけ抜粋) 作業表をD, 工数見積表をC 作業日程表をB とします。  WHERE B.作業コード=D.作業コード AND B.作業コード=C.作業コード AND B.担当者コード=C.担当者コード  問題集には上記のように書いてありましたが、  それ以外で以下のような結合方法も正しいと言える  でしょうか?  WHERE B.作業コード=C.作業コード  AND  B.担当者コード=C.担当者コード AND C.作業コード=D.作業コード  どうぞよろしくお願いいたします。    

  • 表の結合(性能)

    2つのテーブルを(内部)結合させる場合、 INNER JOINによる結合と WHERE句に結合条件を記述する2通りの方法が あると思いますが、どちらが早いのでしょうか? なお、Oracle9i、ルールベースにて構築されています。 テーブルの内容、SQL文は下記のとおりです。 ご教授よろしくお願いします。 ■表 A 項目A-1 ・・・PRIMARY KEY1、INDEX1 項目A-2 ・・・PRIMARY KEY2、INDEX2 項目A-3 ・・・PRIMARY KEY3 項目A-4 ■表 B 項目B-1 ・・・PRIMARY KEY1、INDEX1 項目B-2 ・・・PRIMARY KEY2、INDEX2 項目B-3 ・・・PRIMARY KEY3 項目B-4 ※項目A-1と項目B-1にて結合。  項目A-2が"01"と等しいレコード。 表Aのレコード件数>表Bのレコード件数 【WHERE句にて結合】 SELECT * FROM A,B where A.項目1 = B.項目1 and A.項目2 = '01' 【INNER JOINにて結合】 SELECT * FROM A INNER JOIN A ON A.項目1 = B.項目1 AND A.項目2 = '01'

  • SQL文で質問です

    SQL文で質問です。 テーブルA X NUMBER型 Y DATE型(年月日と時間) テーブルB Z NUMBER型 W DATE型(年月日) A,BをAを主テーブルとして外部結合し、同じ年月日でBには無いデータ を取得したいのですが、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND A.Y = B.W(+) AND B.Z IS NULL; というSQL文を実行すると、テーブルAには時間まで登録されているので 実際には取得したいデータが存在しても 「レコードが選択されませんでした」 になってしまいます。このため、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W,'YYYY/MM/DD')(+) AND B.Z IS NULL; としてみたところ、今度は3行目で 「ORA-00936: 式がありません」 というエラーになってしまいます。 外部結合にしたことがエラーの原因のようなのですが、DATE型の項目を キーにして外部結合にするにはどうすれば良いのでしょうか?

  • Access結合後の短いテキスト型のインデックス

    Accessの検索にて、テーブルA LEFT JOIN テーブルB で外部結合し、 WHERE句でテーブルBの短いテキスト型を抽出条件にすると、検索が遅くなります。 【テーブル定義】 テーブルA( ・年月日(日付/時刻、重複ありインデックス) ・コード(短テキスト、重複ありインデックス) ・属性あ(短テキスト、重複ありインデックス) ・属性い(短テキスト、重複ありインデックス) ) テーブルB( ・コード(短テキスト、主KEY) ・属性う(短テキスト、重複ありインデックス) ・属性え(数値、重複ありインデックス) ) 【件数】 テーブルA:15万件 テーブルB:500件 =====SQLここから===== SELECT * FROM テーブルA LEFT JOIN テーブルB ON テーブルA.コード = テーブルB.コード WHERE 属性あ IS NULL AND 属性い = 'あああ' AND 属性う = 'アアア' AND 属性え = 1 GROUP BY 年月日、 属性う =====SQLここまで===== この検索SQLは遅い(1分30秒くらい)のですが 『AND 属性う = 'アアア'』を削除すると 10秒くらいに速くなります。 ”属性う” のインデックスが効いてないように見えるのですが どのようにチューニングしたら速くなるでしょうか? エクセルからLAN越しにDAO接続してSQL実行してます。 AccessはOffice365(バージョン1902)です。

  • 2つのテーブルの結合に関してです

    お世話になります PHP5,MySql5.0.33にて開発を行っています 2つのテーブルの結合部分で困っています TABLE1 ---------------------------------- ID DATE1 DATE2  COUNT ---------------------------------- 1  2/27  2/20  10 2  2/27  2/20  10 ---------------------------------- TABLE2 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1  2/21  2/26  5 2  2/21  2/27  5 ---------------------------------- 上記2つのテーブル(TABLE1/TABLE2)から TABLE1のDATE1=2/27より過去の行とTABLE2のDATE2=2/27より過去の行を 取得したいのですが上手くいかず…(下SQLで記述しています) SELECT DISTINCT TABLE1.* FROM TABLE1,TABLE2 WHERE TABLE1.ID=TABLE2.ID AND TABLE1.ID=1 AND (TABLE1.DATE1<='2009/2/27' OR TABLE2.DATE2<='2009/2/27') (結合のそもそもの理解が間違っているかも知れませんが…;) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • SQL Server7.0での特殊な結合演算子について

    最近、SQLServer7.0をいれて勉強しています。 http://www.techscore.com/tech/sql/index.html を参考に勉強しています。 そこの特殊な結合演算子の自然結合,指定結合ができません。 受注表、顧客表は「テーブルの結合」のところのテーブルを作成しました. NATURAL JOINの結合やON句を使う指定結合をやると 「列のプレフィックス '受注表' は、テーブル名と一致しないか、クエリ内の別名と一致しません」 というエラーがでます。WHERE句を使った結合だとできます。 何が問題なのでしょうか。 参考HPには「SQL92はある種の共通する結合操作を簡単に実行できるように、特別な構文を用意している」 とかいてあるですが、 SQLServer7.0にはバージョンが古すぎてSQL92がないってことなんでしょうか。 SQLServerをはじめたばかりなので、あまりくわしくないのですが、是非ともご教授よろしくおねがいします。

  • 複数行を1行にするSQL

    以下のような5つのレコードがあった場合に --- AAAAAAA X AAAAAAA Y AAAAAAA Z BBBBBBB P BBBBBBB Q 以下のように2行に集約して結果を表示したいのですが、どのようなSQL書けばいいでしょうか? --- AAAAAAA X,Y,Z BBBBBBB P,Q X,Y,Zおよび、P,Qは昇順で左からカンマ区切りで1つの項目に出したいです。 やはり、PL-SQLを書かないとだめですかね? SQLに詳しく、ご存知の方がいらっしゃれば、ご教授願います。

  • 3つ以上のテーブルの結合に関して

    いろいろな書籍を見ながら試してみましたが どうも求めている結果が得られませんでした… ヒントでも構いませんのでアドバイスお願いします。 テーブルの仕様 ■テーブル1■ 店舗コード 日付 フィールド1n フィールド2n フィールド3n フィールド4n ■テーブル2■ 店舗コード 日付 フィールド5 ■テーブル3■ 店舗コード 日付 フィールド6 2つのテーブルの内部結合や外部結合のSQL文は確認できましたが 3つ以上の記述がテキストにありませんでした。 ※もしかしたら2つのテーブルを結合してからかと思いましたが 具体的な方法が思い浮かびませんでした。 オラクルは9g SQL*PLUS ■その他の条件■ すべてのフィールドが例えNULLでも店舗コードと日付 は表示されるようにする。 INを使用して抽出したい店舗コードのみを表示させたい。 (その場合並び替え順を指定したい場合はINのあとで順番を指定すれば よろしいでしょうか?) フィールド1~4までの「n」は同じ種類のフィールドですが区分が10ずつ あり算術演算子で合計を求めた値のみを表示させます。 そのためASを使用してフィールド名を短くしたいと考えています。 店舗コードと日付は3つのテーブルに共通してありますが 結合した場合は1つづつの表示にしたいです。 大変申し訳ございませんが 宜しくお願いします。

  • 【至急】SQLの結合について教えてください。

    select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • エクセルのクエリ テーブル結合

    エクセル2000を使用しています。クエリのことがあまりよく判っていない質問かもしれませんが、外部ファイルとして以下のようなCSVファイルを2つ、クエリテーブルで結合したいのです。  A B 1 X Y 2 X Y と  A B 1 X Z 2 X Z を結合して  A B C 1 X Y Z 2 X Y Z のようにしたいのですがうまくいきません。 クエリについての超・基本的な質問かもしれませんが、ご教示頂けると助かります。宜しくお願いします。