• ベストアンサー

【SQL】SELECT 文で外部のレコードと比較する。

こんにちわ タイトルがわかりにくく申し訳ありません。^^;) 【やりたい事】 ○テーブルA に下記のレコードが有ります。 ID FIRSTNAME  LASTNAME 00 ICHIRO     SUZUKI 01 TARO      YAMADA 02 TSUYOSHI   SHINJYO ○テーブルB に下記レコードが有ります。 ID LASTNAME 00 SUZUKI 01 SASAKI ここで テーブルB に登録されている LASTNAME と同じ LASTNAME を持つレコードを テーブルA から抽出する SQL を教えて頂けないでしょうか? この状態で抽出されるレコードは 00 ICHIRO SUZUKI です。 お時間のある時で構いませんので、よろしくお願い致します。

  • sho_ta
  • お礼率68% (221/322)

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

データベースとして、何を使用されているか不明でしたので、Oracle で 確認してみました。 SQL> select * from tab1;     ID FNAME      LNAME ---------- ---------------- ----------------      0 Ichiro      Suzuki      1 Taro       Yamada      2 Tsuyoshi     Sinjyo SQL> select * from tab2;     ID LNAME ---------- ----------------      0 Suzu      1 Sasa      2 inj 上記の状態で、先頭一致をさせる場合 SQL> Select tab1.id, fname, tab1.lname from tab1, tab2    where substr(tab1.lname, 1, length(tab2.lname)) = tab2.lname;     ID FNAME      LNAME ---------- ---------------- ----------------      0 Ichiro      Suzuki 部分一致をさせる場合 SQL> Select tab1.id, fname, tab1.lname from tab1, tab2    where instr(tab1.lname, tab2.lname) > 0;     ID FNAME      LNAME ---------- ---------------- ----------------      0 Ichiro      Suzuki      2 Tsuyoshi     Sinjyo でどうでしょうか? substr, instr と同等の関数は、Oracle 以外でも用意されていると 思いますので、他のデータベースでも使えると思います。

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 どのSQLかわからないので、うまくいくかどうかはわかりませんが。 SELECT * FROM テーブルA WHERE LASTNAME IN (SELECT LASTNAME FROM テーブルB WHERE テーブルB.LASTNAME = テーブルA.LASTNAME) または、 SELECT * FROM テーブルA WHERE EXISTS (SELECT * FROM テーブルB WHERE テーブルA.LASTNAME = テーブルB.LASTNAME)

sho_ta
質問者

補足

申し訳ありません。質問の内容をちょっと間違えました。 正確には テーブルBのレコードが ID LASTNAME 00 SUZU 01 SASA となります。 つまり完全一致ではないのです。 WHERE LASTNAME LIKE '%SUZU%' OR LASTNAME LIKE '%SASA%' と同様の抽出をしたいのです。

  • AREC
  • ベストアンサー率32% (23/70)
回答No.1

select * from A where LASTNAME in (select LASTNAME from B); で如何でしょうか?

sho_ta
質問者

補足

申し訳ありません。質問の内容をちょっと間違えました。 正確には テーブルBのレコードが ID LASTNAME 00 SUZU 01 SASA となります。 つまり完全一致ではないのです。 WHERE LASTNAME LIKE '%SUZU%' OR LASTNAME LIKE '%SASA%' と同様の抽出をしたいのです。

関連するQ&A

  • 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

  • select文

    お世話になります。 以下のような内容のテーブルA、B、Cがあります。 テーブルA  id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N テーブルAとテーブルCは「id」がキーで1:N このような3のテーブルで idを検索キーにして次のフィールドのデータを抽出したいのですが。。。(テーブルCのc_dateを降順で) id a_data a_date テーブルBのidで検索したレコード数 説明不足かもしれませんがよろしくお願いします。

  • SQL文の書き方について

    お世話になります。下記のような結果を求めるSQL文についてどなたかご教示をお願いします。 以下の2つのテーブル(SMPL_TBL1,SMPL_TBL2)があったとします。 (SMPL_TBL1) ID | NAME | BUSHO ---+--------+--------- 01 | YAMADA | A_GRP 02 | SUZUKI | A_GRP 03 | OKADA | B_GRP 04 | TAKAGI | C_GRP (SMPL_TBL2) ID | POINT | ---+-------+- 01 | 1 | 01 | 2 | 01 | 3 | 02 | 1 | 02 | 2 | 03 | 1 | 04 | 1 | 04 | 2 | 04 | 3 | 04 | 4 | 04 | 5 | 上記テーブルから以下のような結果を得たい場合、 どのようなSQL文を投げればいいでしょうか? (求める結果) ・各人ごとのPOINTのMAX値と各人のデータを抽出(POINTは1~999までの整数です) ID | NAME | POINT| BUSHO ---+--------+------+-------- 01 | YAMADA | 3 | A_GRP 02 | SUZUKI | 2 | A_GRP 03 | OKADA | 1 | B_GRP 04 | TAKAGI | 5 | C_GRP よろしくお願いいたします。

  • SQL文の構築について教えてください。

    SQL文の構築について教えてください。 こんばんは。Oracle9iのデータベース検索で、どうしてもSQLが思い浮かばないため、質問させていただきます。 ■Table ID    NUM   SIGN 100   1    A 100   2    A 101   1    A 102   1    B 103   1    B 104   1    C 首キーはID、NUMです。 上記のようなテーブルで、 IDが同一かつNUMが最大のもので、 SIGNが同一のレコードで、2件以外のレコードを抽出したいです。 (例表でいうと、ID104のレコードのみが抽出されるようにしたい) すこし急ぎなんですが、SQLが得意でお時間がある方、力を貸していただけないでしょうか。 よろしくお願い致します。

  • SQL文の書き方(こんなこと出来ますか)

    テーブルA(ID、A,B,中身) テーブルa(A、コードの名前1) テーブルb(B、コードの名前2) ID、A、コードの名前1、B、コードの名前2、中身という風に結果を得たいのですが、Aがテーブルaに存在する、又はBがテーブルbに存在するものを出力したいのですがJoinが良く分かりません。aまたはbに存在しない時はコードの名前はNullにしたく、また抽出されテーブルAのレコードが重複しないようにしたいのですが、考えても分かりません。ご教授下さるようお願い致します。

    • ベストアンサー
    • MySQL
  • 結果を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は作成可能でしょうか?

  • select文の記述について

    select文の記述について質問させていただきます。 下記のデータベースのテーブルの先頭からnumberを条件として 2名分のデータをselect文にて抽出したいと思っております。 (numberが重複し、重複数も異なるデータとなります。) select文の記述をどのようにするか教えていただければと思っております。 よろしくお願いいたします。 データベースのテーブル +——+—————+—————+————+ | id | name | number | score | +——+—————+—————+————+ | 1 | tanaka | 358 | 98 | | 3 | tanaka | 358 | 23 | | 4 | tanaka | 358 | 45 | | 11 | yamada | 126 | 63 | | 17 | yamada | 126 | 77 | | 23 | suzuki | 274 | 36 | | 45 | suzuki | 274 | 16 | | 59 | suzuki | 274 | 89 | | 73 | suzuki | 274 | 75 | | 80 | hanako | 89 | 24 | | (以下続く) | +——+—————+—————+————+ 抽出結果 +——+—————+—————+————+ | id | name | number | score | +——+—————+—————+————+ | 1 | tanaka | 358 | 98 | | 3 | tanaka | 358 | 23 | | 4 | tanaka | 358 | 45 | | 11 | yamada | 126 | 63 | | 17 | yamada | 126 | 77 | +——+—————+—————+————+

    • ベストアンサー
    • MySQL
  • ポスグレ レコードの比較

    ポスグレDBで以下のような二つのテーブルがあって レコード数、カラム等の構造も同じだったとして カラム1の値が二つのテーブルで同じであり カラム2~4のうちどれか一つでも違うレコードを抽出するSQLがわかりません。 下記の例で言うと抽出結果がスキーマA.テーブルAの「←」のレコードを抽出したいです。 スキーマA.テーブルA カラム1|カラム2|カラム3|カラム4| --------------------------- A |aaaaaaa|bbbbbb|ccccccc --------------------------- B |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- C |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- D |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- E |aaaaaaa|bbbbbb|ccccccc スキーマB.テーブルB カラム1|カラム2|カラム3|カラム4| --------------------------- A |aaaaaaa|bbbbbb|ccccccc --------------------------- B |1111111|bbbbbb|ccccccc --------------------------- C |aaaaaaa|777777|ccccccc --------------------------- D |2222222|bbbbbb|8888888 --------------------------- E |aaaaaaa|bbbbbb|ccccccc よろしくお願いします。

  • SQL文で

    SQL2000serverで 異なる2つのデーターベースの中にある 別のテーブルの情報を SQL文を使って、抽出する事は出来るのでしょうか? たとえば下記のように「DB-A」「DB-B」と言った 二つのDBの中のそれぞれのテーブルのIDフィールドで リレーションを取ってDB-AのTablA1のFldAの 値(AA)からDB-BのTablB1のFldBの値(あ)を 抽出することはSQL文で可能なのでしょうか? DB-A DB-B TablA1 TableB1 ID FldA ID FldB 1 AA 1 あ 2 BB       2 い 3 CC 3 う 4 DD 4 え

  • 別レコードと比較条件文

    別レコードと比較条件文 下記のテーブルがあります。 ・番号1から始まり番号が2に採番されると、履歴番号に番号1が入ります。 ・履歴番号はひとつ前の番号を持ちます。 ・Aテーブルのレコード数は100以上あります。 Aテーブル ID 番号 履歴番号 A 1 NULL A 2 1 A 3 2 B 1 NULL B 2 1 B 3 2 結果として出力させたいのは、変更回数です。 ・履歴番号は実際のデータですと10桁の複雑な文字列です。 ほしい出力結果 ID 番号 履歴番号 変更回数 A 1 NULL 0 A 2 1 1 A 3 2 2 B 1 NULL 0 B 2 1 1 B 3 2 2 行いたい条件式とは、 一行目:履歴番号がNULLのときは変更回数0とする。 二行目:履歴番号が他レコードの番号と一致する場合、1を持つ。そのレコードの履歴回数がNULLなら判定終わり。 三行目:履歴番号が他レコードの番号と一致する場合、1を持つ。そのレコードの履歴番号が更に他レコードと一致する場合、2を持つ。そのレコードの履歴回数がNULLなら判定終わり。 このようにして変更回数を設定したいのですが、思いつきませんのでご教示お願いできますでしょうか。 試してみたのは、DECODE(履歴番号,'','0',番号,1) とまでためしに作りましたが、同じレコード同士の比較になってしまうため、比較できません。