• 締切済み

oracleでテーブルからのデータ抽出

以下の様なテーブルがあります。 テーブルから姓が同じで、名が一方はNULLで、一方はNULL以外である レコードを全て抽出したいのですが、どのようにすればよいですか。 お願いします。 ■tbl1 ID SEI MEI EMAIL ---- ----------------------- 1 yamada ichiro 2 yamada jiro 3 yamamoto taro 4 sato 5 sasaki taro 6 aoyama 7 akasaka 8 sasaki 9 saito saburo 10 hanada 11 saito 12 hosokawa kuro 13 hanada hanako 14 yamamoto 15 hanada taro 期待する結果 ID SEI MEI EMAIL ---- ----------------------- 3 yamamoto taro 14 yamamoto 5 sasaki taro 8 sasaki 9 saito saburo 11 saito 10 hanada 12 hosokawa kuro 13 hanada hanako 15 hanada taro

  • Oracle
  • 回答数3
  • ありがとう数6

みんなの回答

  • y_shimizu
  • ベストアンサー率41% (27/65)
回答No.3

> and sei in(select t.sei from tbl1 t where t.mei is not null ) > を条件に追加したら上手くいくのでしょうか。 うまくいかないですか? 例としてテーブルのデータが以下のみである場合  1 yamada ichiro  2 yamada  3 yamamoto taro ここに以下3種類のselectをすると  クエリ1 select * from tbl1の結果(全件検索)   1 yamada ichiro   2 yamada   3 yamamoto taro  クエリ2 select sei from tbl1 where mei is nullの結果(meiがnullのもの)   2 yamada  クエリ3 select sei from tbl1 where mei is not nullの結果(meiがnullでないもの)   1 yamada   3 yamamoto meiがnullの行とmeiがnullでない行がほしいので、 クエリ2とクエリ3に共通で引っかかるyamadaをクエリ1の条件としたものが ほしいデータということになります。 なので、クエリ2とクエリ3を条件にクエリ1を投げているだけです。

abc999xyz
質問者

お礼

すみません。 上手くいきます。 > and sei in(select t.sei from tbl1 t where t.mei is not null ) を条件に追加したら、なせ、上手くいくのでしょうか。 の質問でした。 説明、解説ありがとうございました。

  • y_shimizu
  • ベストアンサー率41% (27/65)
回答No.2

じゃあ、こうですかね? select * from tbl1 where sei in(select t.sei from tbl1 t where t.mei is null ) and sei in(select t.sei from tbl1 t where t.mei is not null )

abc999xyz
質問者

お礼

ありがとうございます。 期待した結果が得られました。

abc999xyz
質問者

補足

すみません。 > and sei in(select t.sei from tbl1 t where t.mei is not null ) を条件に追加したら上手くいくのでしょうか。 理解不足ですみません。

  • y_shimizu
  • ベストアンサー率41% (27/65)
回答No.1

こういうことでしょうか? select * from tbl1 where sei in(select t.sei from tbl1 t where t.mei is null );

abc999xyz
質問者

補足

ありがとうございます。 確かに取得はできたのですが、姓が重複しない名がNULLの行も出力されます。 この行は除きたいです。

関連するQ&A

  • エクセル 2003 にて

    会員制の顧客リストがあるのですが、今後も顧客が増えていく事をふまえて リスト上で重複したデータを抽出するように値を返すことが出来る関数式はどうなりますか? ------------------------------------------------      A          B      C       D 1  yamada taro    23歳  09-123-4567  2  yamada hanako  21歳  01-234-5678 3  sasaki kojirou   18歳  23-456-7890      ・     ・     ・      ・     ・     ・ 58 yamada hanako  21歳  01-234-5678      ・     ・     ・      ・     ・     ・ -------------------------------------------- といったように、データベースとしては今後も増えていくことを前提とした上で Cの番号で抽出を行い、既に登録されていた場合に ----------------------------------------------- 58 yamada hanako  21歳  01-234-5678  再 ----------------------------------------------- と Dの列に値が返されるように表示したいのです。 IF関数とDCOUNT関数を合わせると良いのかなとおもったのですが… よろしくお願い致します。

  • phpのページが白紙で表示される

    phpのページが白紙で表示される phpでメールフォームを作成しています。 フォーム画面から確認画面に遷移すると ページが白紙で表示されてしまい困っています。 生成されたページのソースをブラウザで見ても 何も書かれておらず、本当に白紙の状態です。 <html>より前に書いたソースに問題がありそうですが 理由がわかりません。 どなたか解決策にお心当たりございましたらお願いいたします。 以下問題のページ<html>までのソース ———————————————————— <?php function checkInput($var) { if (is_array($var)) { return array_map('checkInput', $var); } else { if (get_magic_quotes_gpc()) { $var = stripslashes($var); } if (preg_match('/¥0/', $var)) { die('不正な入力です'); } if (!mb_check_encoding($var, 'UTF-8')) { die('不正な入力です'); } return $var; } } session_start(); $_POST = checkInput($_POST); $sei = isset($_POST['sei']) ? $_POST['sei'] :NULL; $mei = isset($_POST['mei']) ? $_POST['mei'] :NULL; $address = isset($_POST['address']) ? $_POST['address'] :NULL; $email = isset($_POST['email']) ? $_POST['email'] :NULL; $error = array(); if (trim($sei) == '') { $error[] = '必須項目です'; } else if (mb_strlen($sei) > 10) { $error[] = '10文字以内でお願いいたします'; } if (trim($mei) == '') { $error[] = '必須項目です'; } else if (mb_strlen($mei) > 10) { $error[] = '10文字以内でお願いいたします'; } if (trim($address) == '') { $error[] = '必須項目です'; } else if (mb_strlen($address) > 100) { $error[] = '100文字以内でお願いいたします'; } if (trim($email) == '') { $error[] = '必須項目です'; } else { $pattern = '/^([a-z0-9¥+_¥-])(¥.[a-z0-9¥+_¥-]+)*@([a-z0-9¥-]+¥.)+[a-z]{2,6}$/iD'; if (!preg_match($pattern, $email)) { $error[] = 'メールアドレスの形式が正しくありません'; } $_SESSION['sei'] = $sei; $_SESSION['mei'] = $mei; $_SESSION['address'] = $address; $_SESSION['email'] = $email; $_SESSION['error'] = $error; if(count($error) > 0) { $dirname = dirname($_SERVER['SCRIPT_NAME']); $dirname - $dirname == DIRECTORY_SEPARATOR ? '' : $dirname; $uri = 'http://' . $_SERVER['SERVER_NAME'] . $dirname . '/present.php'; header('HTTP/1.1 303 See Other'); header('Location: ' . $uri); } else { ?> <html> ———————————————————— よろしくお願いいたします。

    • 締切済み
    • PHP
  • 複数テーブルが絡む複雑なUPDATE文の書き方

    こんばんは 次のような2つのテーブルを参照して条件を指定するUPDATE文はどのように書けばよいのでしょうか? Parentsテーブル ID, Name, HasChild, AGE 1, Tanaka, True, 20 2, Yamamoto, False, 25 3, Suzuki, True, 30 4, Kobayashi, True, 20 5, Sato, True, 25 Children ID, Name, ParentID, Male, Flag 1, Taro, 1, True, 0 2, Hanako, 1, False, 0 3, Ichiro, 3, True, 0 4, Jiro, 4, True, 0 5, Subroh, 5, True, 0 やりたいこと:20歳の親を持つ男の子のみにフラグを付ける Parentテーブルで、親が子持ち(HasChild = True)で、年齢が20歳の人だけを対象に Childrenテーブルでその親の子(Parents.ID = Children.ParentID)が男の子(Male = True)だった場合、 Flag を 0 から 1 に変更する 実行結果 Children ID, Name, ParentID, Male, Flag 1, Taro, 1, True, 1 2, Hanako, 1, False, 0 3, Ichiro, 3, True, 0 4, Jiro, 4, True, 1 5, Subroh, 5, True, 0 結果は、Tanaka TaroくんとKobayashi Jiroくんのフラグが1になります。 複数テーブルのSELECTについては勉強してきましたが、こういうパターンは初めてでわかりません。エクセルVBAから.mdbファイルを扱う時に使います。Microsoft.Jet.OLEDB.4.0のADODB.Connectionを使っています。 よろしくお願いします。

  • 結果を1行に編集するSQL

    SQLは初心者なんで、プログラムで実装するしかないかの判断もできなく相談しています。 CTRL_TBL は以下のとおりです NO COLNANE 1 FIRSTNAME 2 LASTNAME 3 ADDRESS 4 YEAR DATA_TBLは FIRSTNAME LASTNAME ADDRESS YEAR TARO YAMADA CHIBA 23 JIRO SASAKI GUNMA 32 HANAKO SATO SAPPORO 25 CTRL_TBLで動的に指定したNOの列を表示したいのです 例として、NO IN (1,4)の場合には結果に FIRSTNAME YEAR TARO 23 JIRO 32 HANAKO 25 SELECT ( SELECT COLNANE FROM CTRL_TBL WHERE NO IN (1,4) ) FROM DATA_TBL; 上記では当然エラーとなります。 実現可能なsqlは作成可能でしょうか?

  • 2つのテーブルからデータを抽出

    同じ列が存在する2つのテーブルがあります。 その2つのテーブルの同じ列同士を突き合わせ、 同じ条件の値を表示したいのですが、 SQL文で可能なのでしょうか? 例: 条件としてテーブル1、テーブル2の列Aが3以下の数字すべて テーブル1 列A ― 1 1 2 3 4 5 テーブル2 列A ― 1 2 2 3 3 3 3 4 4 5 ほしい結果 A|A ―― 1|1 1| 2|2  |2 3|3  |3  |3  |3 不躾な質問で恐縮ですが、 アドバイスお願いいたします。

  • 3つのテーブルからのデータ抽出

    こんばんは。 久しぶりの投函ですが、以下の内容を処理することが出来ずに悩んでおります。 テーブルを結合して・・というのは、分かるのですが、ネットで検索してもその殆どが2つのテーブルに関するものなので、その設定が出来ずに時間を費やしている状況です。 お忙しい中恐縮ですが、アドバイスなど頂戴できたら幸いです。 table:main id name 1 たかし 2 しげる 3 あけみ 4 ひろみ 以下のtableのid、p_idは、mainTBのidを指しています。 table:frend no id p_id 1 2  3 2 4  1 3 1  2 4 2  4 5 3  1 以下のtableのidは、mainTBのidを指しています。 table:comment no id naiyou 1 3 よろしく 2 4 こんにちは 3 2 おめでとう 4 3 楽しい 以上のテーブルが存在し、mainのid、しげるを検索した際、 frendTBに参照し、しげる(id=2)に該当するp_id(この場合、3、4)を探し、且つcommentTBにあるidである、naiyouを表示したいと考えてます。 実際の表示はこんな感じ・・ しげる(id=2)を検索した場合、 よろしく  あけみ こんにちは ひろみ 楽しい   あけみ 以上、アドバイスだけでも結構です。ご指導のほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 3つのテーブルからのデータ抽出

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa3421595.html 以前、上記箇所にて似たような質問をさせていただきましたが、同じテーブルを用い、違う検索結果を出そうとしたところ、思うような結果を得られずに居る次第です。 今日も一日中試行錯誤を繰り返しているのですが、どうにも描いている結果を得ることが出来ません。お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。(MySQL 4.1) 前回の質問は・・・ memberテーブル id  n_name 1  大輔 2  雅彦 3  順子 4  幸子 5  明美 6  二郎 friendテーブル(id、f_idは、memberテーブルのidを指す。) no id f_id 1  3  5 2  5  3 3  3  1 4  1  3 5  3  6 6  6  3 diaryテーブル(idはmemberテーブルのidを指す。memberのidに該当する人の発言データ) no id  date  subject 1  3   //  今日は寒いね 2  5   //  美味しそう 3  2   //  疲れたな 4  2   //  頑張ろう 5  1   //  楽しいぞ 6  6   //  晴れるといいな ※dateは省略しています。 以上、例えばmemberテーブルにおいて、id(下記SQLでは$tb_idとしています)が3の順子を検索した際、 friendテーブルを参照し、idカラムが3の相手であるf_idを見つけ、更にそのf_idを基にmemberテーブル内のn_name、 かつdiaryテーブル内の、date、subjectを下記のように一覧表示させたいという質問でした。 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう と、ここで、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 以上のように自分の発言を表示させようと、したところ現在、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 順子 今日は寒いね と、自分の発言が2度出てきてしまう状態です。 ちなみにSQL文は、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id,f.id from member as m inner join friend as f on m.id=f.id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id WHERE ((f.id=$tb_id OR f.f_id=$tb_id) AND f.id!=f.f_id) order by no desc LIMIT 0, 30;"; ここ数日、色々調べており、特に昨夜からは(今日も一日中。汗)ずっと試行錯誤を繰り返しているのですが、思い描く結果を得ることが 出来ない状態です。 お忙しい中恐縮では御座いますが、アドバイスのほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 2つのテーブルからデータ抽出

    こんばんは。お世話になっております。 以前にも似たような質問を投函させて頂きましたが、知識が乏しく、適切なキーワードが思い当たらず、検索しても目的の情報に辿り着かずに投函させて頂きます。 Aテーブル id | picture   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 | aaa.gif 2 | bbb.gif 3 | ccc.gif 4 | ddd.gif 5 | eee.gif Bテーブル id | ma_id | f_id   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 |  2  |  3 2 |  3  |  1 3 |  3  |  4 4 |  5  |  2 上記テーブルA・Bのidはindex というようなテーブルがあり、テーブルBの、ma_idおよびf_idはテーブルAのidと同じ分類となっており、テーブルAのidを呼び出した際、 2だったら、3 ccc.gif と、5 eee.gif 3だったら、2 bbb.gif と、1 aaa.gif と、4 ddd.gif のように、テーブルBにおいて、テーブルAで登録されているidが、テーブルBのma_id,f_idのどちらかに登録されていたら、その一方のidと同じ番号となるテーブルAのpictureを抽出したいと考えております。 $manage_id=$_GET["id"]; $sql= "select * FROM B INNER JOIN A ON B.ma_id = A.id OR B.f_id = A.id WHERE ma_id = '$manage_id' OR f_id = '$manage_id' order by (ma_id OR f_id) limit 0,3 "; 現在、以上のようなソースですが、アドバイスなど頂戴できたら幸いです。 尚、バージョンですが、開発時と運用時では違うバージョンになる可能性が大のため、テーブルの設定なども含め、バージョンに囚われない無難な設定法かどうか、もご指摘頂けたら幸いです。 お忙しい中恐縮ですが、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • JSONPでのおかしな挙動

    最近Ajaxの勉強を始めたものです。 クロスドメインでの通信を行うため、レンタルサーバー2個(ドメイン2個) の環境で、JSONPを使って下記のようなコードを記述したところ、無事に 動作が確認できました。 ●HTML(ドメイン1) <html> <head> <title>JSONPテスト</title> <script type="text/javascript"> function callback(data) { contents = "姓: " + data.sei + " 名: " + data.mei; alert(document.getElementById('here').innerHTML); //初期値です document.getElementById('here').innerHTML = contents; } var url = "ドメイン2のURL/callback.js"; var script = document.createElement('script'); script.setAttribute('src', url); document.getElementsByTagName('head')[0].appendChild(script); </script> </head> <body> <div id="here">初期値です</div> </body> </html> ●callback.js(ドメイン2) callback({"sei": "山田", "mei": "太郎"}); ところが、上記のドメイン1の代わりにブログを使い、ドメイン2 としてレンタルサーバーでテストしたところ、 document.getElementById("here") is null というエラーが出てしまいます。 ブログとしては、SeesaaとFC2を利用したところ、どちらもNGでした。 alertで変数をチェックしたところ、本来「初期値です」というテキスト が表示されるはずのところが、nullになっており、どうも該当タグが DOMで認識されていないようです。 一方で、同じく無料ブログにおいて、単純に、 <script type="text/javascript"> alert(document.getElementById('here').innerHTML); //初期値です </script> のみを実行すると、こちらはうまくいくのです。 関数での変数のスコープの問題かとも思いますが、どうにも理解でき なくて困っています。 アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • AJAX
  • Oracle SQLでのデータ抽出

    Oracle、SQLともに初心者のため困っています。 どなたか教えてください。 フィールド1、2で重複(2件以上存在)するレコードに対して、そのテーブルの全項目を取得したいのです。 例: 処理前 フィールド1,フィールド2 ,フィールド3 1 , AA, 1 1 , AA, 2 1 , BB, 3 1 , BB, 4 2 , CC, 5 2 , CC, 6 3 , DD, 7 4 , EE, 8 5 , FF, 9 処理後 フィールド1, フィールド2,フィールド3 1 , AA, 1 1 , AA, 2 1 , BB, 3 1 , BB, 4 2 , CC, 5 2 , CC, 6 どうしたらよいでしょうか? よろしくお願い致します。