あいまい条件抽出についてのSQL文について

このQ&Aのポイント
  • SQL文でのあいまい条件抽出について教えてください。指定のテーブルとカラムを使用し、あいまい検索をする方法を知りたいです。
  • Oracle 11gの環境で、tableAとtableBのカラムを結合してあいまい検索をする方法を教えてください。
  • SQL文を使用して、tableAのカラムAとtableBのカラムBをあいまい検索する方法を教えてください。Oracle 11g環境を使用しています。
回答を見る
  • ベストアンサー

あいまい条件抽出についてのSQL文について

あいまい条件抽出についてのSQL文について hiroです。 SQL文について、教えてほしいのですが、 下記のようなDatabaseがあったとします。 tableA:カラムA:ABCDE,BCDEA tableB:カラムB:??C?? この場合、例えば、 SELECT * FROM DataBase WHERE tableA.カラムA like tableB.カラムB みたいな感じで、カラムAのABCDEだけを検索するような仕組みを作ることは 可能でしょうか? ※上のSQL文では引っ張れないのは理解できています。 わかる方がいらっしゃいましたら、SQL文を教えてください。 よろしくお願いします。 環境:Oracle 11g

  • Oracle
  • 回答数1
  • ありがとう数7

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

  • ベストアンサー
  • hatimiti
  • ベストアンサー率68% (26/38)
回答No.1

私も勉強がてらやってみました。 TABLE_B には、「__C__」のように、LIKE で使える文字列を入れておきます。 かつ、このSQLでは B の結果を 1 件に絞る必要があります。 ---------- SELECT * FROM TABLE_A WHERE VAL LIKE ( SELECT COND FROM TABLE_B )

hiro300
質問者

お礼

私もいろいろ試してみました。 SELECT * FROM DataBase WHERE tableA.カラムA like Replace(tableB.カラムB,'?','%') でできました。 アクセスですと SELECT * FROM DataBase WHERE tableA.カラムA like Replace(tableB.カラムB,'?','?') って、感じです。理由を聞かれても、わかりませんけど…。 いろいろやり方があるんですね。勉強なりました。 ありがとうございます。

関連するQ&A

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

    Windows2000(SP3) SQLServer2000(SP3) で開発しています。 テーブルA 項目No,大分類コード,中分類コード,詳細コード,日付,内容 テーブルB 大分類コード,中分類コード,詳細コード,新_詳細コード,内容 TableA,Bでは大分類コード,中分類コード,詳細コードがリンクする このような状況で、TableA,Bを下記のようにjoinして、  TableA.大分類コード,   TableA.中分類コード,  TableB.新_詳細コード, が重複するデータを取得する場合のSQL文を教えてください。 (join) SELECT  TableA.*,  TableB.* FROM  TableA LEFT OUTER JOIN  TableB ON  TableA.大分類コード=TableB.大分類コード  AND  TableA.中分類コード=TableB.中分類コード  AND  TableA.詳細コード=TableB.詳細コード よろしくお願いします。

  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。

  • SQL文の書き方

    SQL文の書き方を教えて下さい。 以下の2つのクエリー(1のクエリー&2のクエリー)を1つのクエリーで1度に抽出をかけたいのですがSQL文の書き方がわかりません。 データの発生条件としては TableBのField1は必ずTableAのField1に存在するという条件です。 TableAのField1が「AAA」から「EEE」まである場合は、TableBのField1も必ず「AAA」から「EEE」の範囲内で発生します。 よろしくお願い致します。 1のクエリー ---------------------------------------------------------------- TableA Field1 ---------------------------------------------------------------- AAA AAA AAA BBB BBB CCC DDD DDD EEE EEE EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableA.Field1) as RecCount, TableA.Field1 From TableA 結果 RecCount  Field1 3      AAA 2      BBB 1      CCC 2      DDD 3      EEE ---------------------------------------------------------------- 2のクエリー ---------------------------------------------------------------- TableB Field1 ---------------------------------------------------------------- BBB CCC CCC EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableB.Field1) as RecCount, TableB.Field1 From TableB 結果 RecCount  Field1 1      BBB 2      CCC 1      EEE ---------------------------------------------------------------- 希望する結果 TableAのRecCount TableBのRecCount TableAのField1 3                   AAA 2         1         BBB 1         2         CCC 2                   DDD 3         1         EEE

  • こんなSQL文

    Oracle8.1.7を使用しております。 以下のようなテーブルに対し、1行目と2行目を削除するSQL文を書きたいのですが、思いつきません。どなたか、アドバイスいただけないでしょうか? 表名:A   B | C ――――――――   2 | 10   2 | 1   1 | 10   1 | 1   1 | 11   1 | 2   1 | 1   3 | 10   2 | 3 変数として、P1=1とP2=2があります。(これは、SQL文の中に直接書くものとします。) ここで、SELECT B,C FROM A WHERE B=1;とSELECT B,C FROM A WHERE B=2;を実行すると、次のようになります。   B | C     B | C ――――――――― ―――――――――   1 | 10    2 | 10   1 | 1     2 | 1   1 | 11    2 | 3   1 | 2   1 | 1 ここで、それぞれの表を見ると、Cの値が一致している部分があります。この一致していて、Bが2の行を削除したいのですが、SQL1文では無理でしょうか? 最近、SQLには慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。

  • 演算子の件です。

    演算子の件です。 例えば、 a.field と b.fieldが等しいデータと抽出 SELECT * FROM tablea AS a, tableb AS b WHERE a.field = b.field はOKなのですが、 a.field に b.fieldが含まれるデータと抽出 SELECT * FROM tablea AS a, tableb AS b WHERE a.field like %b.field% は駄目でした。 値であれば %atai% でOKだと思うんですが、フィールドを指定した値で 任意文字等を指定することは可能なのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL文

    http://okwave.jp/qa/q1599858.html この質問に疑問があります。 回答2で where (column1 || '/' || column2 ||'/' || column3) like '%word1%' ; というアドバイスに対して質問者は where ( concat( column1 , column2 , column3) like '%word1%' ) でできたと返しています。 なぜ、質問者はwhere ( concat( column1 , column2 , column3) like '%word1%' ) というSQL文にいたったのでしょうか? where ( concat( column1 , column2 , column3) like '%word1%' ) では、だめだったのでしょうか?

    • ベストアンサー
    • MySQL
  • グループ毎の条件抽出

    はじめまして。よろしくお願いします。 今、以下のようなデータで以下の抽出条件でデータ取得行いたいと思っています。 ■ TABLEA NO 1~n 識別 A~Z 状況 1~4(null有り) 日付 YYYY/MM/DD 1.識別毎にグループ分けをしたい。 2.「1.」の中で状況が最大値の物のみ抽出 3.「2.」の中で日付が最大値の物のみ抽出 4.識別が無いものは各行出力 5.「1.~3.」の中で抽出されたデータのTABLEAのカラムを全て取得 今は以下のようなSQLで実現させようとしておりますが、 インラインビューを何度もネストしている為あまりパフォーマンスが 良くないです。もっと効率的なSQLが在れば教えていたければと思います。 SELECT /* 4.対象TABLEAのデータを取得 */ * FROM TABLEA, /* 2.グループの中で日付日付の最大値を求める */ (SELECT MAX(TABLEA.日付) AS 最新日付, TABLEA.状況 TABLEA.識別 FROM TABLEA, /* 1.識別毎に状況の最大値を求めるグループ */ ( SELECT MAX(状況) AS 状況最大値, 識別 FROM TABLEA WHERE 識別 IS NOT NULL GROUP BY 識別 )TMP WHERE TABLEA.識別 = TMP.識別 TABLEA.状況 = TMP.状況最大値 )TMP2 TABLEA.日付 = TMP2.最新日付 TABLEA.状況 = TMP2.状況 TABLEA.識別 = TMP2.識別 /* 3.識別は無いものを取得 */ UNION SELECT * FROM TABLEA WHERE 識別 IS NULL 以上です。よろしくお願いします。

  • 最も抽出結果が多い条件の取得

    下記のようなSQLがあるとき、最も検索結果が多くなる●(抽出条件)を 取得したいのですが、わかるかたいらっしゃいますか。 (●画面から入力される抽出条件。) select * from A where A.a1 like '●%' or A.b1 like '●%' 質問が簡易ですみませんが、よろしくお願いします。

  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL
  • Oracle SQL DELETE文のレスポンス

    いつもお世話になっております。 この度は、手前のSQL文において DELETE文のレスポンスが上がらずに難儀しています。 現在DELETE処理はバッチにて行っています。 最初にSELECTにて抽出を行ったものをバックアップにとり、 次は同様の条件でDELETE文で処理しています。 この際に、SELECTでは1秒程度で済んだ処理が、 DELETE文ではレスポンスが返ってこないという状況です。 何がまずいのか、どう工夫すればいいのか 色々変えてみましたがレスポンスは改善されません。 SQLと条件は以下です。 【SQL文】 SELECT 複数の項目 FROM TABLEA A WHERE NOT Exists(SELECT 'X' FROM TABLEB B WHERE A.ITEMNO = B.ITEMNO) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO = C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < C.REPYMD) AND NOT Exists (SELECT 'X' FROM TABLEA2 A2 WHERE A.ITEMNO = A2.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A2.CREATEDATE,'YYYYMMDD')) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO != C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A.CREATEDATE,'YYYYMMDD')) 上記のSELECT文の後に処理されるDELETE文は 「SELECT 複数の項目 FROM TABLEA A」 ⇒ DELETE FROM TABLEA A としたもので、 条件は全てSELECT文と同様のものを使用しています。 ◆条件を言葉で明記すると以下のようになります。 1.Bテーブルに存在するものは削除対象外とする 2.AテーブルのアイテムIDとCテーブルのアイテムIDは一致する。   AテーブルのCREATEDATEとCテーブルのREPYMDのいずれかが3ヶ月以内のアイテムは   削除対象外とする 3.AテーブルもしくはCテーブルにしか存在しない場合は、各日付が3ヶ月以内のアイテムは   削除対象外とする 以上のようになっています。 どなたかアドバイスをいただければ幸いです。 宜しくお願い致します。