• ベストアンサー
  • 困ってます

分岐SQLを一発のSQLで実現したい

【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数459
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.3

補足ありがとうございます。 ということは >001  AAA  DDD があって >NULL  AAA  DDD もあるというのは間違っていますよね。 ですので、以下のデータと結果を正として考えます。 --データ 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  EEE --DDDをEEEに変えました NULL  AAA  BBB NULL  AAA  CCC --結果 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  EEE 以下のSQLでどうでしょうか。 select 種類,キー1,キー2 from (  select 種類,キー1,キー2,count(*) over(partition by キー1,キー2) cnt  from (   select 種類,キー1,キー2 from Table1   union select 種類,キー1,キー2 from Table2   union select 種類,キー1,キー2 from Table3  ) ) where 種類 is not null or cnt = 1 order by 種類,キー1,キー2; 全角スペースでインデントしているので、実行時には削除するか半角スペースに置き換えるなどしてください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

括弧閉じるの後に、テーブル別名を付ければ可能でした! すみません! over句により、partition by でグループ化された、数(count(*) )が、cntに表示されるのですね! NULLだけのデータなら、必ず1になりますから、 where句で条件付けすると! 勉強になりました! 真にありがとうございます!

質問者からの補足

ありがとうございます。 over句やpartition by は知識がなかったので、 学ぼうと思います! ちょっと実行してみたのですが、 ---------------------------------------- ')' 付近に不適切な構文があります。 ---------------------------------------- 最後の')'付近のエラーが出ます。 全角スペースのインデントも取り除いておりますので、 エラーの原因はお分かりになるでしょうか? またご面倒ですが、返信宜しくお願い申し上げます。

関連するQ&A

  • データの加工方法(SQL)について

    「TABLE1」から「TABLE2」というテーブルを作成したいと考えております。 TABLE1ではNAMEという項目がキーとなってデータが入っていました。 それをIDという項目をキーとした形にデータ加工したいと考えています。 各IDにおけるNAMEの数はMAXでも5個までとなります。 何か良い方法は有りますでしょうか? SQLのSELECT文で行う事を考えていますが、方法がわかりませんでした。 (EXCELなどで他に容易な方法があれば他の方法でもかまいません) よろしくお願いいたします。 ■TABLE1 ------------- ID NAME ------------- 1000 AAA 1000 BBB 1000 CCC 1000 DDD 1001 EEE 1001 FFF ------------- ■TABLE2 ---------------------------------------------- ID NAME1 NAME2 NAME3 NAME4 NAME5 ---------------------------------------------- 1000 AAA BBB CCC DDD 1001 EEE FFF ----------------------------------------------

  • SQLについてお聞きします

    フィールド1 |フィールド2 |フィールド3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、フィールド1のAAAとBBBは値をそのまま抽出し フィールド1のDDDはフィールド2とフィールド3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? フィールド2とフィールド3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • SQL文を教えてください。

    すみません、SQLを教えてください。 ID, 名前の2つのフィールドを持つテーブルがあります。 中身は以下のように入っています。 1, AAA 2. AAA 2, BBB 3, CCC 3, AAA 4, DDD 5, EEE, 5, DDD これを、名前のダブリをスキップしながら、 IDの大きな順番に名前を取り出したいのです。 結果は、以下のようになればいいです。 DDD EEE AAA CCC BBB どのようなSQLを組んだら実現できますか? よろしくお願いいたします。

その他の回答 (2)

  • 回答No.2

条件がいまいち理解できません・・ >1)同種類、キー1、キー2のデータで、 >種類にNULLが含まれていたら、NULLのデータは取得しない >2)同種類、キー1、キー2のデータで、 >種類にNULLしかないデータは、取得する 同種類のなかで種類がNULLって矛盾していませんか? 同種類というくくりにならないですよね。 仮に2)を 同一のキー1、キー2のデータで、 種類にNULLしかないデータは、取得する という条件だとしても >001  AAA  DDD があるのに >NULL  AAA  DDD がいるというのが分かりません。 SiegruneさんのSQLでも、 >NULL  AAA  DDD このデータは取得できないように思います。 本当に1)と2)の条件で実現したいことを表せていますか? もしくは提示したデータと期待結果が間違ってはいないですか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

書込みありがとうございます。 仰る通り言葉がおかしかったです 同種類とは云っても、NULLは別物です。 1) 同キー1、同キー2のデータで、 種類がNULLと、種類がNULL以外が混じっていたら、NULL以外のデータを取得 2) 同キー1、同キー2のデータで、 種類がNULLだけのデータなら、NULLのデータを取得 上記になります。 正しいご指摘誠にありがとうございます!

  • 回答No.1

↓結果 に 001  AAA  BBB がありませんが、あるものとして回答します。 (002  AAA  BBB を除去せず、  001  AAA  BBB のみを除去するためのロジックが書かれていないので。) select * from Table1 as m1 where not ( 種類 is null and ( exists (select * from Table1 as s1 where s1.種類 is not null and s1.キー1 = m1.キー1 and s1.キー2 = m1.キー2 ) or exists (select * from Table2 as s2 where s2.種類 is not null and s2.キー1 = m1.キー1 and s2.キー2 = m1.キー2 ) or exists (select * from Table3 as s3 where s3.種類 is not null and s3.キー1 = m1.キー1 and s3.キー2 = m1.キー2 ) )) union all select * from Table2 as m2 where not ( 種類 is null and ( exists (select * from Table1 as s1 where s1.種類 is not null and s1.キー1 = m2.キー1 and s1.キー2 = m2.キー2 ) or exists (select * from Table2 as s2 where s2.種類 is not null and s2.キー1 = m2.キー1 and s2.キー2 = m2.キー2 ) or exists (select * from Table3 as s3 where s3.種類 is not null and s3.キー1 = m2.キー1 and s3.キー2 = m2.キー2 ) )) union all select * from Table3 as m3 where not ( 種類 is null and ( exists (select * from Table1 as s1 where s1.種類 is not null and s1.キー1 = m3.キー1 and s1.キー2 = m3.キー2 ) or exists (select * from Table2 as s2 where s2.種類 is not null and s2.キー1 = m3.キー1 and s2.キー2 = m3.キー2 ) or exists (select * from Table3 as s3 where s3.種類 is not null and s3.キー1 = m3.キー1 and s3.キー2 = m3.キー2 ) )) インデックスの持ち方とデータ件数によっては下のほうが早いかもしれません。 select * from Table1 as m1 where not ( 種類 is null and exists (select * from (select distinct キー1,キー2 from (select * from Table1 as s1 where s1.種類 is not null union select * from Table2 as s2 where s2.種類 is not null union select * from Table3 as s3 where s3.種類 is not null ) ) as x where m1.キー1 = x.キー1 and m1.キー2 = x.キー2 )) union all select * from Table2 as m2 where not ( 種類 is null and exists (select * from (select distinct キー1,キー2 from (select * from Table1 as s1 where s1.種類 is not null union select * from Table2 as s2 where s2.種類 is not null union select * from Table3 as s3 where s3.種類 is not null ) ) as x where m2.キー1 = x.キー1 and m2.キー2 = x.キー2 )) union all select * from Table3 as m3 where not ( 種類 is null and exists (select * from (select distinct キー1,キー2 from (select * from Table1 as s1 where s1.種類 is not null union select * from Table2 as s2 where s2.種類 is not null union select * from Table3 as s3 where s3.種類 is not null ) ) as x where m3.キー1 = x.キー1 and m3.キー2 = x.キー2 )) table1/table2/table3にまったく同一のデータはない、または、あったときには、 1レコードでるだけでいいならば union all をunionにしてもらっても問題ないです。 ## 未検証。ケアレスミスがあったらごめんなさい。 ## エラーメッセージ書いてもらえば訂正に戻ってきますので。 ## (とりあえず考え方は分ってもらえるかなと。)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

結果を間違っておりました! 仰る通り、001  AAA  BBBは取得します。 ちょっと参考にしてみます! 頑張ってみます。

関連するQ&A

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

  • デルファイでのSQL文について

    まだ初心者なのでよく分かりません。SQL文について教えてください。 テーブル名:table1 データ:   コード   日付     種類   備考 (1) 1111   2003/12/11  book  AAA (2) 2222   2003/11/10  pencil BBB (3) 2222   2003/12/10  pencil CCC (4) 2222   2003/12/20  cap   DDD 上のようなデータがあった場合、コードと種類が同じで日付が最新のデータを取りたいのですがSQL文でできるでしょうか? 上の場合だと(1)と(3)と(4)のデータを抽出したいのです。GROUP BYですると備考がとれませんでした。 どうぞよろしくお願いします。   

  • SQL文 テーブル1つに複数のデータ

    お世話になっております。 SQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 2.次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 これを1つのSQLで実行したいのですが、副問合せを駆使しても、良いSQLが思い浮かびません。 有識者の方、ご享受頂きたいです。 宜しくお願い致します。

  • SQL 複数条件を設定

    PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1   a-2   b-1    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd      2   ggg   bbb   ccc        3   bbb   mmm  ddd       4   ggg   mmm  ccc    : TABLE2   a-1   a-2        c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     1   bbb   aaa        eee         2   ggg   mmm       qqq    : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1   a-2   b-1  c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd  eee    2   ggg   bbb   ccc   ※    3   bbb   mmm  ddd   ※    4   ggg   aaa   ccc   qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。

  • SQL文について

    お世話になります。 Oracle初心者です。 二つのテーブルから下記の様にデータを抽出 したいのですが、その方法をご教授くださいます様、 宜しくお願い致します。         記 テーブル1 品番  全長 aaa 1111 bbb 2222 ccc 3333 テーブル2 品番  入数 bbb 5 ddd 6 ggg 7 SQL結果 品番 全長  入数 aaa 1111 bbb 2222 5 ccc 3333 ddd 6 ggg 7

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • SQLでできること

    SQLだけでできることと、できないことって、一言で言い表せるでしょうか? データベースからデータを取り出すとき、どこまでできて、どこからはphpなど他の言語で処理したらいいのか、とても気になるんです。 もしかして、何でもできるのかな? というのも、今やりたいと思っていることが、 (環境はMySQL+PHP使用で、ブラウザで表示させます) テーブル A(人物のリスト) id|name ------- 1 | aaa 2 | bbb 3 | ccc 4 | ddd テーブル B(人物と成績のリスト) name| point ------------- aaa | 10 bbb | 15 bbb | 10 aaa | 20 bbb | 25 ccc | 30 のようなテーブルがあったとき、 aaaのpointの合計 = 30 bbbのpointの合計 = 50 cccのpointの合計 = 30 dddのpointの合計 = 0 ← テーブルBに載ってない人もいる という人物全員の結果の集計をするには、どうすると最適でしょう? 私がすぐ思いつくのは、テーブルAのデータを配列に読み込んで、それを元に次はテーブルBから、人物別の行を取り出すSQL文を作って、pointを集計するという手順です。他に手段はあるでしょうか?

    • ベストアンサー
    • MySQL
  • SQLについて教えてください

    お世話になります。 SQLについて教えてください AテーブルとBテーブルからCテーブルを作成したいのですが、 KEYをキーにAテーブルのIDが1で、YYMMが一番新しい項目(最大の項目)を 取得し、Cテーブル作成したいのですが、どのようにするのでしょうか? Aテーブル    Bテーブル   Cテーブル KEY ID yymm   KEY     KEY YYMM AAA 0 200612  AAA     AAA 200611 AAA 1 200611  BBB     BBB 200611 AAA 1 200609 BBB 0 200611 CCC 1 200611

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

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

  • 同じ列に2行づつで出力するSQL

    次のようなテーブルがあったとき no | name 1 | aaa 3 | bbb 4 | ccc 6 | ddd (先頭はカラム名です) 以下のように出力するSQLは書けますでしょうか? no1| name1 | no2| name2 1 | aaa | 3 | bbb 4 | ccc | 6 | ddd