• 締切済み

副問合せ?の書き方

データの副問合せではまってます。 助言いただければ幸いです。 やりたい事 B_IDを起点に、C表E_IDのNAMEを表示。またB表に紐付くA表とC表のE_IDを比較し、一致する場合○をつける。 A表 A_ID,T_ID,E_ID :(A_IDプライマリキー) B表 B_ID,T_ID :(B_IDプライマリキー) C表 C_ID,B_ID,E_ID :(C_IDプライマリキー) E表 E_ID,NAME :(E_IDプライマリキー) 要件 ・取得したいのは以下の条件のE表のNAME。 ・C表のE_IDでNAMEを取得する。 ・C表とA表をE_IDで比較し、一致する場合NAMEの横に「○」をつける。 ・B表のB_IDを指定し、B表(T_ID)と一致するA表とB表(B_ID)と一致するC表を比較。 上記の実行のために以下のSQLを作成しましたが、副問合せで複数行戻るためエラーが出て、 条件をはずすと結果が思うようにでません。 できればSQL文でやりたいのですが こういう場合はどうすればいいのでしょうか? わかりづらいと思いますがよろしくお願いします。 SELECT E.NAME, IF(C.C_ID = (SELECT W.C_ID FROM C AS W JOIN B AS X ON W.B_ID=X.B_ID JOIN A AS Y ON Y.T_ID=X.T_ID WHERE X.B_ID=B.B_ID AND W.E_ID=Y.E_ID),'○','') FROM A,B,C,E WHERE C.E_ID=E.E_ID AND B.B_ID=1; バージョン:MySQL5.0

みんなの回答

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

やりたいことが複雑なので整理してみる。 要件: 1)結局一番取得したいのはEのNAME 2)C.E_ID = A.E_ID の場合NAMEの横に○をつける。。 3)B.B_ID を指定(??)し、B.T_ID = A.T_ID and B.B_ID = C.B_ID を比較。 3)が何をしたいかが不明。指定をするのはどういう意味ですか? また、比較とはどのよう比較すればいいのですか? 比較した結果どのようにしたいのですか? 全体的に質問文(定義)が不明です。 こういうことですか? select NAME,if(C.E_ID=A.E_ID,'○','-') from E left join C on E.E_ID = C.E_ID left join B on C.B_ID = B.B_ID left join A on B.T_ID = A.T_ID ## 以下テストデータ create table A ( A_ID text, T_ID text, E_ID text ); create table B ( B_ID text, T_ID text ); create table C ( C_ID text, B_ID text, E_ID text ); create table E ( E_ID text, NAME text ); insert into A values('A1','T1','E1'); insert into A values('A2','T2','E2'); insert into B values('B1','T1'); insert into B values('B2','T2'); insert into C values('C1','B1','E1'); insert into C values('C2','B2','E2'); insert into E values('E1','NAME1'); insert into E values('E2','NAME2'); insert into E values('E3','NAME3');

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

各表のデータ例と、得たい結果例を示せませんか?

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

関連するQ&A

  • JOINを使ったSQL文を作成しようとしています。

    JOINを使ったSQL文を作成しようとしています。 以下の様な3つのテーブルがある場合のSQL文を教えて下さい ※勉強の為、適当なテーブルを作成しましたが、やりたい事は  JOINの中に更にJOINさせたSQL文を作成したいと思ってます 表A  USER_ID(プライマリキー)  NAME 表B  USER_ID(プライマリキー) ※表A.USER_IDと紐着く  BUMON(プライマリキー)  TERM(プライマリキー) 表C  BUMON(プライマリキー) ※表B.BUMONと紐着く  TERM(プライマリキー) ※表B.TERMと紐着く  MEMBER 【取得したい項目】  表A.USER_ID 【抽出条件】  表CのMEMBERの値が'10','20'以外(である表AのNAMEを取得)

  • 副問い合わせについて

    お世話になります。明日から仕事で使うのですが、下記の構文が よく理解できません。宜しくお願い致します。 SQL Severは経験ありません。 経験はInfomixSql,Access,MySql程度です。 (1)行副問い合わせ(副問い合わせの結果が1行n列で返ってくる) SELECT * FROM t1 WHERE (c4, c2) = (SELECT MAX(c1), 'a' FROM t2); このwhere節の結合条件はどのような感じになるのでしょうか? (2)表副問い合わせ(副問い合わせの結果がm行n列(表)で返ってくる) SELECT * FROM t1 WHERE c4 IN ( SELECT c1 FROM t2 WHERE c4 >= 10 ) ORDER BY c1; 、 SELECT x1.c1, x2.y4 FROM t1 x1, ( SELECT c3, SUM(c4) AS y4 FROM t2 GROUP BY c3) AS x2 WHERE x1.c3 = x2.y4 ORDER BY c1; (1)に同じです。 参考になりそうなサイトでも結構ですので 宜しくお願い致します。

  • 副問い合わせの不可解な問題

    情報処理試験を受験しようと思いますが、前提知識の補強に今苦戦しています。SQLの問題で以下の出題趣旨と解答の理由がわかりませんでした。どなたか解釈いただければ幸いです。 問)次の表1と表2に対するSQL文のうち、適切なものはどれか 表1        表2 X | Y |Z |   X | Y |Z | a1 | b1|1|  d1 | e1|1| a2 | b2|1|  d2 | e2|1| a3 | b3|2|  d3 | e3|2| ア.Select X FROM 表1  WHERE ( SELECT Y FROM 表2 ) = Y イ.Select X FROM 表1  WHERE Y IN( SELECT * FROM 表2 WHERE Z = 1) ウ.Select X、Y FROM 表1  WHERE Y IN( SELECT Y FROM 表2 WHERE Z = 1) エ.Select X、Y FROM 表1  WHERE Y =( SELECT Y FROM 表2 WHERE Z = 1) 正解はウですが。ウではどのような表が最終的にできるのかわかりません。副問い合わせの仕組みはおぼろげに他の本でわかりましたが、本設問については何度考えてもわかりません。 どなたか助けてください。、。

  • 3つの表を1つに縦に連結する

    3つの表W、X、Yがあって、 これらの列を縦に連結して表Zに するにはどのようにすれば良いでしょうか? ちなみにDBはAccess2000です。 宜しくお願いします。 表W F1|F2 ----- A |B A |B 表X F1|F2 ----- C |D C |D 表Y F1|F2 ----- E |F E |F 表Z F1|F2 ----- A |B A |B C |D C |D E |F E |F

  • 副問い合わせを使わずに書く方法

    テーブルAとBがあり、どちらも列idとnameがあります。Aのnameは最初はNULLです。AのnameをBから持ってきてUPDATEしたい(AのidのうちBにあるもののnameをAにコピーする)のですが、MySQLのバージョンが古く、副問い合わせが使えず、以下のようなことができないので困っています。どなたか教えていただけませんか。 UPDATE A SET name = ( SELECT name FROM B WHERE A.id = B.id ) WHERE EXISTS ( SELECT 'X' FROM B WHERE A.id = B.id ) ;

    • ベストアンサー
    • MySQL
  • こんばんは。

    こんばんは。 軽いSQL文がかけずに困っております。 どなたかご教示願います。Postgres8.3になります。 テーブル名 num カラムはuserとidとします。 データは最下部にあるように持ちます。 a~eのユーザのうち、idが2200番台のうち、2201と2202だけをもつユーザを抽出するSQL文を望みます。 a:2200と2203が存在するので偽 b:真 c:2202が無いので偽 d:2203が存在するので偽 e:真 このようなSQLを書きました。 1.numより2201を持つuser 2.numより2202を持つuser 3.numより22~で始まる以外のuser それぞれの等しいuserが真と思ったのですが、本来3.では22~始まるidを持たないuser としなければなりませんでした。 ここで詰まってしまい、タイムアップとなってしまいました。 どのようなSQLが望ましいでしょうか。 よろしくお願いいたします。 select * from num as m, (select x.user from (select user from num where id = 2201 group by user_id) as x, (select user from num where id = 2202 group by user_id) as y, (select user from num where id::text not like '22%' group by user) as z where x.id = y.id and x.id = z.id and y.id = z.id) as n where m.id = n.id; num user,id a,1000 a,1100 a,2000 a,2100 a,2200 a,2201 a,2202 a,2203 a,3000 b,1000 b,2100 b,2201 b,2202 b,3000 b,3100 c,1000 c,2201 c,2203 c,3000 c,3100 c,3200 d,1000 d,2100 d,2201 d,2202 d,2203 d,3000 d,3100 d,3200 e,1000 e,2201 e,2202 e,3000 e,3100 e,3200 e,3300

  • 4次元空間の超平面で、パラメータを消去するには?

    4次元のxyzw直交空間を考えます。 直線は、パラメータを用いて、 x=x[0]+a[1]s y=y[0]+b[1]s z=z[0]+c[1]s w=w[0]+d[1]s のように書けて、パラメータを消すと、 (x-x[0])/a[1]=(y-y[0])/b[1]=(z-z[0])/c[1]=(w-w[0])/d[1] のように書けます。 平面(?)は、パラメータを用いて、 x=x[0]+a[1]s+a[2]t y=y[0]+b[1]s+b[2]t z=z[0]+c[1]s+c[2]t w=w[0]+d[1]s+d[2]t のように書けますが、パラメータを消すとどうなるのでしょうか? 超平面は、パラメータを用いて、 x=x[0]+a[1]s+a[2]t+a[3]u y=y[0]+b[1]s+b[2]t+b[3]u z=z[0]+c[1]s+c[2]t+c[3]u w=w[0]+d[1]s+d[2]t+d[3]u のように書けますが、パラメータを消すとどうなるのでしょうか? おそらくAx+By+Cz+Dw+E=0のように書けるとは思いますが、それらの係数は具体的にはどのような形なのでしょうか? 3次元空間の平面の場合には、この最後の問いは、2つの3次元ベクトルの外積で表されると思うので、今回の設定を4次元にしてみました。

  • 超越関数Eiを使う方程式について

    超越関数Eiを使う方程式について Ae610様やaquatarku5様の方法に従い考えてみました。 土、日とこの問題のことばかり考えています…助けて下さい。 x^2y''-5xy'+8y=e^x に対して、x=e^tとしてtによる微分方程式を求めると、 y' = dy/dx = (dy/dt)/(dx/dt) = y'e^(-t) y''= dy'/dx = (dy'/dt)/(dx/dt) = e^(-2t){y''-y'} 与式に代入して、 e^(2t)e^(-2t){y''-y'}-5e^ty'e^(-t)+8y=e^e^t, y''-6y'+8y=e^e^t…(1) 特性方程式より、z^2-6z+8=0,z=4,2 (1)を同次式とした場合の解はy = C1e^(4t)+C2e^(2t) これに対し、y''-6y'+8y=e^e^tの解をy = Ae^(4t)+Be^(2t)として求める。…(2) ここでhttp://www.osakac.ac.jp/labs/mandai/writings/De-03m2.pdf http://okwave.jp/qa/q5832858.htmlを参考にします。 y'={A'e^(4t)+A4e^(4t)} + {B'e^(2t)+B2e^(2t)} A'e^(4t)+B'e^(2t)=0とすると…(3) y'=A4e^(4t)+B2e^(2t) y''={A'4e^(4t)+A16e^(4t)} + {B'2e^(2t)+B4e^(2t)} これらを(1)に代入して、A'4e^(4t)+B'2e^(2t)=e^e^tを得る…(4) (3)と(4)を連立させて、A'=e^e^t/2e^(4t) , B'=e^e^t/-2e^(2t) を得る。 A=∫ e^e^t/2e^(4t) dt、ここでe^t=Zとして、 ∫ e^z/(2z^4)・1/z dz = 1/2∫ e^z/z^5 dz 部分積分を反復して、-1/48{e^z(6/z^4+2/z^3+1/z^2+1/z)-Ei(z)}+C1を得る。(Cは積分定数) zにe^tを代入してA=-1/48{e^e^t(6/(e^t)^4+2/(e^t)^3+1/(e^t)^2+1/e^t)-Ei(e^t)}+C1…(5) B=∫ e^e^t/-2e^(2t) dt、ここでe^t=Zとして、 ∫ e^z/(-2z^2)・1/z dz = -1/2∫ e^z/z^3 dz 部分積分を反復して、1/4{e^z(1/z^2+1/z)-Ei(z)}+C2を得る(Cは積分定数) zにe^tを代入してB=1/4{e^e^t(1/(e^t)^2+1/e^t)-Ei(e^t)}+C2…(6) (2)(5)(6)よりy=Ae^(4t)+Be^(2t) = -1/48{e^e^t(6 + 2e^t + e^(2t) + e^(3t))-e^(4t)Ei(e^t)}+1/4{e^e^t(1+e^t)-e^(2t)Ei(e^t)}+C1e^(4t)+C2e^(2t) <これが(1)の解> (1)の解に対してe^t=xとすると、x^2y''-5xy'+8y=e^xの解が求められる。 y = C1x^4+C2x^2-1/48{e^x(6 + 2x + x^2 + x^3)-x^4Ei(x)}+1/4{e^x(1+x)-x^2Ei(x)} 以上で如何でしょうか? かなり長くなりましたので計算ミスが心配です。

  • 横並び表記について

    すみません。。 ACCESSで以下のようなtbテーブルを横に表示たいと思うのですが、 idが飛ぶと歯抜け状態になってしまいます。。 これをidが飛んでも詰める形にするにはどのようにすればよいでしょうか。。 tb id name 1 a 2 b 3 c 4 d 5 e 7 g 実行結果 a.id a.name b.id c.name c.id c.name 1 a 2 b 3 c 4 d 5 e 7 g sql構文 SELECT a.*, b.*, c.* FROM ((SELECT * FROM tb1 WHERE id Mod 3=1) AS a LEFT JOIN (SELECT * FROM tb1 WHERE id Mod 3=2) AS b ON a.id+1=b.id) LEFT JOIN (SELECT * FROM tb1 WHERE id Mod 3=0) AS c ON a.id+2=c.id ORDER BY a.id

  • 結果にテーブル上存在しない列&値をつけたい。

    SELECT ID, NAME FROM TEST たとえば上記の結果で ID NAME 1 'A' 2 'B' 3 'C' 4 'D' 5 'E' と返ってくるとします。 これにテーブルには存在しない列をつけて、かつ、 こちらで指定した値を入れたいのですが可能でしょうか。 ID NAME VALUE 1 'A' 'あ' 2 'B' 'い' 3 'C' 'う' 4 'D' 'え' 5 'E' 'お' こうしたいのです。 SELECT ID, NAME, 'あ' AS VALUE FROM TEST これだと全て「あ」になってしまいますし…。 可能であればご教授いただけないでしょうか。