あいまい条件抽出についてのSQL文について
- 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
- hiro300
- お礼率100% (40/40)
- Oracle
- 回答数1
- ありがとう数7
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
私も勉強がてらやってみました。 TABLE_B には、「__C__」のように、LIKE で使える文字列を入れておきます。 かつ、このSQLでは B の結果を 1 件に絞る必要があります。 ---------- SELECT * FROM TABLE_A WHERE VAL LIKE ( SELECT COND FROM TABLE_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の制御文をうまく追加できない。
- ベストアンサー
- Oracle
- 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 Server
- こんな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 以上です。よろしくお願いします。
- ベストアンサー
- Oracle
- 最も抽出結果が多い条件の取得
下記のようなSQLがあるとき、最も検索結果が多くなる●(抽出条件)を 取得したいのですが、わかるかたいらっしゃいますか。 (●画面から入力される抽出条件。) select * from A where A.a1 like '●%' or A.b1 like '●%' 質問が簡易ですみませんが、よろしくお願いします。
- ベストアンサー
- Oracle
- 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ヶ月以内のアイテムは 削除対象外とする 以上のようになっています。 どなたかアドバイスをいただければ幸いです。 宜しくお願い致します。
- ベストアンサー
- Oracle
お礼
私もいろいろ試してみました。 SELECT * FROM DataBase WHERE tableA.カラムA like Replace(tableB.カラムB,'?','%') でできました。 アクセスですと SELECT * FROM DataBase WHERE tableA.カラムA like Replace(tableB.カラムB,'?','?') って、感じです。理由を聞かれても、わかりませんけど…。 いろいろやり方があるんですね。勉強なりました。 ありがとうございます。