Access 2010でのデータ抽出方法
- Access 2010でのデータ抽出には、EXISTSとLIKEを使用する方法があります。
- テーブルAから条件に合致するデータを抽出し、テーブルBのデータとの一致を確認します。
- しかし、現在のSQL文ではデータの追加件数が0となっており、LIKEの使用方法やEXISTSの設定に問題がある可能性があります。
- ベストアンサー
アクセス2010 EXISTSの使い方
テーブルA F1 F2 あい False いえ True おか True きく True けこ False テーブルB F1 あ か け TB1にTB2が含まれるデータを抽出して テーブルC F1 あい けこ をつくりたい。 DoCmd.RunSQL "INSERT INTO テーブルC (F1) " + _ "SELECT F1 From テーブルA " + _ "Where F2=False And " + _ "EXISTS (SELECT * FROM テーブルB WHERE テーブルA.F1 Like '*テーブルB.F1*' );" としたのですが、追加件数は「0」です。 Likeの使い方が悪いのか、EXISTSが悪いのか? どのようにしたらTB3の結果を得られるでしょうか?
- situmonnsya
- お礼率70% (374/532)
- その他(データベース)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
INSERT INTO テーブルC ( F1 ) SELECT A.F1 FROM [テーブルA] AS A WHERE A.F2='False' AND Exists ( SELECT 'X' FROM [テーブルB] AS B WHERE A.F1 Like '*' & B.F1 & '*' ); あるいは、 INSERT INTO テーブルC ( F1 ) SELECT A.F1 FROM [テーブルA] AS A WHERE A.F2='False' AND Exists ( SELECT 'X' FROM [テーブルB] AS B WHERE Instr(A.F1,B.F1)>0 ); でどうでしょう? ご健闘を。
関連するQ&A
- distinct をexistsに変換する
distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3 FROM TABLE1 a,TABLE2 b,TABLE3 c WHERE a.ID1 = b.ID1(+) AND a.ID1 = c.ID1(+)
- ベストアンサー
- Oracle
- DELETE 文とEXISTSの使い方について(Oracle10g)
DELETE 文とEXISTSの使い方について(Oracle10g) 2つのテーブル(A、B)を外部結合して、B側がNULLとなったレコードを A側から削除する、というDELETE文が作りたいのですが、 EXISTS句を使ってみたもののどうも使い方がわからず苦戦しています。 目的は2つのテーブルを同期させる事で このSQLを実行する時点で、常にA>Bになっています。 目的を達成できるSQLを教えてください。 <削除対象レコードをSELECTするSQL> SELECT * FROM A, B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ; <上をDELETE文にしてみたつもりが、削除0件になってしまうSQL> DELETE FROM A WHERE EXISTS( SELECT 1 FROM B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ) ;
- ベストアンサー
- Oracle
- Not Exists の絞込みについて
SQLServer2005 Express にて次のようなSQLをVB.NET2005で発行しようとしたらうまくいきません SELECT CustomerID,CustomerName FROM T_Customer WHERE Kana LIKE N'カ%' OR Kana LIKE N'キ%' OR Kana LIKE N'ク%' OR Kana LIKE N'ケ%' OR Kana LIKE N'コ%' AND not exists(select 1 from T_ABC where T_Customer.CustomerID=T_ABC.CustomerID 目的はT_ABCテーブルにあるデータ以外のデータの中からカ行のKana読みの データのみを抽出するものです SQL初学者でお恥ずかしい限りですがよろしくご教授ください
- ベストアンサー
- SQL Server
- EXISTSを使ったDELETE文
「SELECT文の件数」と、 「同じSELECT文を使ったDELETE文の件数」が一致しない現象が起き、困っています。 【SELECT文】※2件返ってきます。 SELECT a.部署コード, a.社員コード FROM 社員マスタ a, 組織マスタ b WHERE a.部署コード = b.部署コード 【DELETE文】※50件 DELETEされます。 DELETE TABLE 社員マスタ WHERE EXISTS ( SELECT a.部署コード, a.社員コード FROM 社員マスタ a, 組織マスタ b WHERE a.部署コード = b.部署コード ) 環境はSQLSERVER2005です。 件数はSQLSERVER2005のカウントオプションで表示されているものなので間違いないです。 宜しくお願いします。
- ベストアンサー
- SQL Server
- 【SQL】existsでの商演算
閲覧ありがとうございます. 現在SQLでデータベースの勉強をしているのですが,existsを用いて商演算を行おうとしてわからない箇所が出てきたので,その点に関しての質問をさせて頂きます. 例として,A,Bと名付けた2つのテーブルを最初に用意します. [テーブル1(名前:机1)] | 番号 |氏名|年齢| 好物 | --------------------------- | 12 | あ | 1 | りんご | | 23 | い | 1 | すいか | | 23 | い | 1 | りんご | | 45 | え | 3 | すいか | | 45 | え | 3 | りんご | [テーブル2(名前:机2)] | 好物 | ---------- | りんご | | すいか | この机1を机2で割ることで,この要素を含む氏名を取り出したいと考えて,以下のようなSQL文を実行しました. select 氏名 from 机1 A where exists( select * from 机2 B where A.好物 = B.好物); [求めている結果表示] | 番号 |氏名| ------------- | 23 | い | | 45 | え | [実際に表示された結果] | 番号 |氏名| ------------- | 12 | あ | | 23 | い | | 23 | い | | 45 | え | | 45 | え | 実行すると (1)氏名が重複で表示されてしまう (2)「りんご」のみ好物の「あ」も表示されてしまう という問題が発生してしまい,色々と調べて考えたものの,結局分からなかったので,今に至ります. 長文・駄文すみませんでした. まだSQLを学び初めて少ししか経っていないので,全く違うことをしていたらすみません.よろしければ,問題解決へのアドバイスをお願いします.
- ベストアンサー
- PostgreSQL
- INNER JOIN > EXISTS > IN
SQL Server 2008での話です。 製品テーブルと、その製品の売れ行きのランキングデータを格納するテーブルがあって、 売れ行きの良いものTOP10だけ取り出したいと思っています。 製品IDがキーになっています。 ランクテーブルから10位以内の製品IDをSELECTし、それをIN句に 入れるということをやっていたのですが、遅かったので、EXISTSに 書き変えました。 更に、INNER JOINにしてしまえば、WHERE句より実行されるので、 より速くなると聞き、試しているところです。 実際、速くはなったのですが、以下パターンだとそれほど差が出ません。 (データの件数のせいだとは思いますが…) どちらがベターなのでしょうか。 Bのほうが先に絞り込みをしてから結合されるから、速い…ような気が しているのですが、動き的には一緒だったりしますかね…。 もしより良い書き方がありましたらご教授ください。 ■Aパターン SELECT * FROM 製品テーブル INNER JOIN ランクテーブル ON 製品テーブル.製品ID = ランクテーブル.製品ID AND ランクテーブル.順位 <= 10 ■Bパターン SELECT * FROM 製品テーブル INNER JOIN ( SELECT ランクテーブル.製品ID FROM ランクテーブル WHERE ランクテーブル.順位 <= 10 ) TMP ON TMP.製品ID = 製品テーブル.製品ID
- 締切済み
- SQL Server
- ACCESSのSQLの書き方
ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)
- ベストアンサー
- その他(データベース)
- UNIONなどで複数のテーブルから上位10件などSELECTする方法
1店舗1テーブルのデータベースにしております。 全店の在庫を検索した時に、まとめてSELECTすると重いため、 TOP100などで、1~100,100~200などと分けたいです。 単テーブルでの分け方は何とか分かっていますが、 複数のテーブルをUNIONで結合した場合の分け方が分りません。 ■ 現状:全店の在庫を各店のテーブルより、取得しています。 SELECT dbo.A店TB.ID, dbo.A店TB.BRAND, dbo.A店TB.CODE, dbo.A店TB.STOCK, dbo.A店TB.STORE FROM dbo.A店TB" + " where dbo.A店TB.CODE like '%" + txbCode.Text + "%' AND" + " dbo.A店TB.BRAND like '%" + txbBrand.Text + "%' AND" + " dbo.A店TB.STOCK > 0" + " UNION " + "SELECT dbo.B店TB.ID, dbo.B店TB.BRAND, dbo.B店TB.CODE, dbo.B店TB.STOCK, dbo.B店TB.STORE FROM dbo.B店TB" + " where dbo.B店TB.CODE like '%" + txbCode.Text + "%' AND" + " dbo.B店TB.BRAND like '%" + txbBrand.Text + "%' AND" + " dbo.B店TB.STOCK > 0" + " UNION " + "SELECT dbo.C店TB.ID, dbo.C店TB.BRAND, dbo.C店TB.CODE, dbo.C店TB.STOCK, dbo.C店TB.STORE FROM dbo.C店TB" + " where dbo.C店TB.CODE like '%" + txbCode.Text + "%' AND" + " dbo.C店TB.BRAND like '%" + txbBrand.Text + "%' AND" + " dbo.C店TB.STOCK > 0" ■ 問題:1店舗、1万レコード(件)のデータがあり、実際には10店舗ほどからデータを取ってくるため、読み込みに時間がかかってしまいます。 ■ やりたいこと:最初の100件だけをSQLのSELECTで取得するクエリを書きたいです。別のプログラムで以下のように書きましたが、 これを上記のUNIONを使ったクエリでもやりたいと考えています。具体的なコードが思いつきません。お願いします。 SELECT TOP 100 BlogTB.TITLE,BlogTB.TEXT " + "FROM BlogTB WHERE ID NOT IN(SELECT TOP 200 ID FROM BlogTB ORDER BY ID DESC) ORDER BY ID DESC"
- ベストアンサー
- SQL Server
- WHERE句に複数テーブルを使いたい
アクセス2010です。 テーブルA F1__テキスト(重複あり) F2__数字 テーブルB F1__テキスト(重複なし) F2__Boolean 条件 ・テーブルAのF2が1の条件で ・テーブルAのF1にテーブルBのF2がない ・テーブルBのF2がTrueであるものだけ DoCmd.RunSQL INSERT INTO テーブルA(F1,F2) SELECT テーブルB.F1,100 FROM テーブルB WHERE テーブルA.F2 = 1 And テーブルA.F1<>テーブルB.F1 And テーブルB.F2 = True; WHERE句に複数テーブルを使いたい時は、どのようにするのでしょうか?
- ベストアンサー
- その他(データベース)
- MYSQLで全てのカラムから検索する。
tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?
- ベストアンサー
- MySQL
お礼
どちらのご回答でもできました。 SQLは超苦手で、EXISTSも覚えたてでした。 Likeの方が悪かったのですね。 ありがとうございました。