- 締切済み
- 困ってます
結合したテーブルに名前をつけるには?
お世話になります。 【前提】 Aテーブル |key|hoge|int1|int2| (keyはユニーク) Bテーブル |key|hogehoge| (keyはユニーク) 上記のテーブルを、下記のSQLで結合。 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` 【目的】 ユニークではない`A`.`hoge`の重複を省き、かつ、`kekka`が最大のものを選びたい。 【考え方】 `A`.`hoge`でグループ化し、max(`kekka`)を選ぶ。 【そのために】 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` IN(SELECT max(`kekka`) FROM `●●` GROUP BY `A`.`hoge`) ★質問です。 1)根本的に足りてない知識は何でしょうか? 2)上記の考え方で間違っていませんか? 3)●●には何を入れればよいでしょうか? (`A`を指定してみましたが、Unknown column 'kekka' in 'field list'といわれてしまいました) MySQLのバージョンは5.1.57です。
- mogem
- お礼率85% (12/14)
- 回答数2
- 閲覧数1310
- ありがとう数0
みんなの回答
- 回答No.2
- Siegrune
- ベストアンサー率35% (316/895)
>【目的】 >ユニークではない`A`.`hoge`の重複を省き、かつ、`kekka`が最大のものを選びたい。 で、なにが出したいのでしょう? >Aテーブル 例 |key|hoge|int1|int2| |111|hhhh|5234|1000| |222|hhhh|9999|1111| |333|jjjj|8888|2222| |444|kkkk|3333|1111| |555|kkkk|6666|2222| とあったら、 SELECT `A`.`key`・・・ は、 111とでる?222とでる?(2222を出したいのですかね。) 次に333とでるのはいいとして、 4444と5555は両方でる?4444がでる?5555がでる?(どちらも最大値)。 `B`.`hogehoge`もおなじ。 |key|hogehoge| |111|hhhhhhhh| |222|iiiiiiii| |333|jjjjjjjj| |444|ssssssss| |555|tttttttt| として、hhhhhhhh?iiiiiiii? ・・・ 4444と5555を両方だすなら、 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` where `A`.`int1` / `A`.`int2` = (SELECT MAX(`X`.`int1` / `X`.`int2`) From `A` as 'X' where 'X'.`hoge` = `A`.`hoge`) 5555だけを出したいなら、 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` where `A`.`key` in (SELECT max(`Y`.`key`) From `A` as 'Y' where `Y`.`int1` / `Y`.`int2` = (SELECT MAX(`X`.`int1` / `X`.`int2`) From `A` as 'X' where 'X'.`hoge` = `Y`.`hoge`) group by 'Y'.`hoge` ) あるいは、 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` where `A`.`key` in (SELECT max(`Y`.`key`) From `A` as 'Y', left inner join (SELECT 'X'.`hoge`,MAX(`X`.`int1` / `X`.`int2`) as `kekka` From `A` as 'X') as 'Z' on 'Z'.`hoge` = 'Y'.`hoge' and `X`.`int1` / `X`.`int2` = `Z`.`kekka` group by 'Z'.`hoge` ) 4444だけを出したいなら、 max(`Y`.`key`) をmin(`Y`.`key`) にします。 ※MySQLは環境ないので未検証です。 >1)根本的に足りてない知識は何でしょうか? ・group byしたときの考え方 select A,B,max(C),min(D) from Q group by A,B というSQLで、max(C)とmin(D)は別のレコードの値がでてくることや、 group by句に含まれない項目は、集計用の関数(MaxやMin、Sumなどなど)を使わないと 値が特定できないので指定できない(エラーになる)こと ・In句の書き方 項目名 in (Select・・・)です。in(Select・・・)では構文エラーです、 というより何と比較するかわかりませn。 ・副問い合わせの使い方 上のを例としてみてください。 他。 ## こういう質問の仕方をされると、 ## つい「SQLの知識」って書いてしまいたくなるので ## 「どういった関数や機能を使ったらいいですか?」とかにしたほうがいいのでは? ## と思ってしまいます。 >2)上記の考え方で間違っていませんか? 上記を参照。 仕様の提示にも漏れがありますが、max(`kekka`)を選んでも、それではうまく特定できない というところが違ってました。 >3)・・・略。
関連するQ&A
- テーブルの結合について質問です。
テーブルの結合について質問です。 テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, . . . FROM SHOSAI T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, T1.BANGO AS 番号, T3.CONTENT AS 曜日, . . . FROM JOHO T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE LEFT OUTER JOIN H_CODE T3 ON T1.J_CODE = T3.CODE . . . この2つのテーブルを結合したいのですが それぞれのデータ数が300あり SELECT*で呼びだしてもCSEはエラーとなってしまいます。 項目名を選定してプログラムを組んでもうまくできません。 良い方法があれば教えてください。
- ベストアンサー
- MySQL
- テーブル結合について、下記SQLをANSI結合の書き方で表したい。
テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key
- ベストアンサー
- Oracle
- ACCESSクエリで複数テーブルの値の結合について
現在、ACCESS2000で2つのテーブルの値を表示するクエリを作成中です。 テーブルは外部データよりインポートしています。 Aテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 100 00000001 | BBBBBBBB | 200 00000002 | AAAAAAAA | 1000 Bテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 500 00000002 | BBBBBBBB | 300 これを、 KEY1 | KEY2 | 値1 ------------------------------------------------ 00000001:00000001 | AAAAAAAA:AAAAAAAA | 100:500 ←(1) 00000001:NULL | BBBBBBBB:NULL | 200:NULL ←(2) 00000002:NULL | AAAAAAAA:NULL | 1000:NULL ←(3) NULL:00000002 | NULL:BBBBBBBB | NULL:300 ←(4) と表示したいのです。 INNER JOIN では、上記(1)しか表示されません。 また、LEFT JOIN では、(1)(2)(3)は表示されますが、(4)が表示されません。 SQLは下記です(INNER JOINを使用した場合) SELECT [Aテーブル.KEY1] & ":" & [Bテーブル.KEY1] AS KEY1, [Aテーブル.KEY2] & ":" & [Bテーブル.KEY2] AS KEY2, [Aテーブル.値1] & ":" & [Bテーブル.値1] AS 値1 FROM Aテーブル INNER JOIN Bテーブル ON ([Aテーブル].[KEY1]=[Bテーブル].[KEY1]) AND ([Aテーブル].[KEY2]=[Bテーブル].[KEY2]); どなかた教えてください。お願いします。
- ベストアンサー
- その他(データベース)
- 回答No.1
- yambejp
- ベストアンサー率51% (3827/7415)
こんな感じ? select A.key,A.hoge,A.int1,A.int2,round(A.int1/A.int2,8) AS kekka,A.hogehoge from A left join B on A.key=B.key where (hoge,round(A.int1/A.int2,8)) IN (select hoge,max(round(A.int1/A.int2,8)) from A group by hoge) ちなみにkeyとかint1,int2などは予約語です。 慣れてないとすぐハマるのでなるべくフィールド名に使わない方がよいでしょう。
関連するQ&A
- 3テーブル外部結合方法について
3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・
- 締切済み
- その他(データベース)
- 3テーブルの外部結合
3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか? ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>> <<B_TBL>> <<C_TBL>> A STOCK B A NYUKA C A SYUKA a01 100 b01 a02 10 c01 a03 10 a02 200 b02 a01 20 c02 a01 20 a03 300 b03 a01 10 c03 a05 10 a04 400 b04 a03 30 c04 a01 30 a05 500 b05 a05 30 c05 a03 20 b06 a02 20 c06 a01 10 b07 a01 10 c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。
- 締切済み
- MySQL
- テーブル名を省略して「h.id」とかって書きたいの
以下SQL文で、「hoge」「red」をそれぞれ、「h」「r」として、「h.id」「r.red_id」とかって書きたいのですが、 どう修正したら良いのでしょうか? (コピペしているので、LEFT JOINの後にテーブル名が来ないとき、どうしたら良いか分かりません) SELECT id, century, tom, best, center, dragon FROM ( SELECT hoge.id, c.century, hoge.tom, hoge.best, hoge.center, u.dragon FROM hoge LEFT JOIN usa u ON hoge.usa_id = u.id LEFT JOIN century c ON hoge.century_id = c.century_id UNION ALL SELECT red.red_id, c.century, red.red_title, red.best, red.center, u.dragon FROM red LEFT JOIN usa u ON red.usa_id = u.id LEFT JOIN century c ON red.century_id = c.century_id ) as PIYO
- ベストアンサー
- MySQL
- LEFT JOIN の結合結果について
お世話になります。 ”SELECT Aテーブル.* Bテーブル.* FROM Aテーブル LEFT JOIN Bテーブル ON Aテーブル.KEY = Bテーブル.KEY”を 行った場合、Aテーブルにしか存在しないデータのBテーブル側の値は常にNULLに なるようなのですが、この場合ゼロを固定に設定することは出来ないでしょうか? よろしくお願いします。 ※ORACLE 9i、PL/SQL上での処理を考えています
- ベストアンサー
- Oracle
- テーブルの結合について
以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID
- 締切済み
- Oracle
- ~JOIN ON句でこのような問い合わせはできるのでしょうか?
SELECT * FROM `テーブル1` AS t1 LEFT JOIN `テーブル2` AS t2 ON ( ( t1.a * 100000 ) + t1.b ) = t2.a エラーはでませんが、意図したレコードが返ってきません。クエリの使い方が間違っているのでしょうか?教えてください。 検証環境:MySQL 4.0.24-standard
- ベストアンサー
- MySQL
- 2テーブルが同じユーザテーブル参照するときの結合
2つのテーブルで、同じユーザテーブルを参照してデータ取得したいのですが、 どうやって結合すれば良いのでしょうか? ■概要 ・ユーザがアクションに挑戦すると、結果を表示 ・その際、「アクション作成者」と「アクション挑戦者(ユーザ)」を表示したい ※「作成者」「挑戦者」は、同じ「user」テーブルで管理したい ■3テーブル ・「result」「action」「user」 ・「result」「action」テーブルには、それぞれ「user_id」カラムがある ・「result」テーブルには、「action_id」カラムがある。1対多? ■知りたいこと ・一気にまとめて一覧として取得する方法 ・最終的に「結果」と、「result」「action」それぞれに対応した「user」テーブルの「name」カラムを取得したい ■試してみたこと ・これだと「挑戦者名」が取得できない SELECT * FROM result r LEFT JOIN `action` a ON r.`action_id` = a.`id` LEFT JOIN `user` u ON r.`user_id` = u.`id` ・これだと「挑戦者」のユーザIDしか取得できない SELECT *,a.user_id AS actionuser_id FROM result r LEFT JOIN `action` a ON r.`action_id` = a.`id` LEFT JOIN `user` u ON a.`user_id` = u.`id`
- ベストアンサー
- MySQL
- 3つのテーブルの処理について
下記のようなテーブルがあったとして、 テーブルAを基準に考えたいのですが、、、、 テーブルAに付加する形でテーブルBのデータのidカウント数が最も少なく、idが同じもの中でdate日が一番新しいデータを表示し、古いものから並べかえかつテーブルCにidがあるものは一番最後にくるという風に並べかえたいのですが、無理でしょうか? 現在下記のようなSQLを考えていますが、うまくいかないです。。 select * from A left join(select id,case when count(id)=0 then 0 else count(id) end AS cnt FROM B group by id order by date) as b on A.id=b.id left join(select id from C) as c on A.id=c.id order by c.id desc,b.cnt; エラー↓ in the GROUP BY clause or be used in an aggregate function テーブルA id | name | comment| 1 あ おい 2 い えい 3 か テス テーブルB id | event | date | 1 test1 2005/1/4 2 test1 2005/1/4 1 test2 2005/3/4 2 test2 2005/3/4 1 test3 2005/5/4 テーブルC id | 1 理想の結合データ id | name | comment| cnt | date | 3 か テス 0 2 い えい 2 2005/3/4 1 あ おい 3 2005/5/4
- ベストアンサー
- PostgreSQL
- SELECT出来るのにDELETE出来ないのはなぜ
MySQLで下記SELECTレコードを削除したいと思い、 DELETEへ変えたら文法エラーになります。 SELECT * FROM `piyo` AS a LEFT JOIN `hoge` AS c ON a.`hoge_id` = c.`hoge_id` WHERE c.`x_id` =13 DELETE * FROM `piyo` AS a LEFT JOIN `hoge` AS c ON a.`hoge_id` = c.`hoge_id` WHERE c.`x_id` =13 どう書けば良いでしょうか?
- ベストアンサー
- MySQL
- 複数テーブルを結合するには?
OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?
- ベストアンサー
- Oracle