• ベストアンサー

MysqlのSQL文について

AccessとMysqlを用いてデータベースシステムを作成しています。 添付図の左の表から,右の表の品番と枝番が一致するデータを削除する場合(今回はaaaの2と6)は,どのようにSQL文を記述すればよいでしょうか? Do Untilで1行毎に比較して削除する方法では時間がかかり過ぎたため,SQL文で一度で処理できないかと考えたのですが,SQL文をどのように記述すればよいかわかりませんでした... お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します。

  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.1

DELETE FROM 左表 右 WHERE EXISTS(SELECT 右.品番 FROM 右表 右 WHERE 左.品番=右.品番 AND 左.枝番=右.枝番)

con014057
質問者

お礼

ご回答ありがとうございます。 問題なく,欲しい結果を得ることができました。 Existsを使用するんですね。Inばかり使用して試していました...

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

create table t1 (品番 varchar(30),枝番 int); insert into t1 values('aaa',1),('bbb',2),('aaa',2),('ccc',3),('aaa',6); create table t2 (品番 varchar(30),枝番 int); insert into t2 values('aaa',2),('rrr',5),('bbb',5),('aaa',6); delete from t1 where (品番,枝番) in (select 品番,枝番 from t2); みたいな感じでよいのでは?

con014057
質問者

お礼

ご回答ありがとうございます。 いろいろな記述方法があり勉強になります。 質問前に,In演算子を使用していろいろ試していたのですが,記述方法が悪かったみたいでした...

関連するQ&A

  • こんな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には慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。

  • SQLサーバー2000でのSQL文の質問です。

    開発環境はSQLサーバー2000です。 下記のような親子関係のテーブルがあった場合に、【結果】のような結果を得れるようなSQL文を教えていただきたいです。 【親】 -------------------------------- |品番 |品名 -------------------------------- |1 |ラーメン -------------------------------- |2 |カレー -------------------------------- |3 |うどん -------------------------------- 【子供】 -------------------------------- |品番 |枝番 |食べた日 -------------------------------- |1 |1 |1/1 -------------------------------- |1 |2 |1/2 -------------------------------- |3 |1 |1/3 -------------------------------- |3 |2 |1/4 -------------------------------- |3 |3 |1/5 -------------------------------- |3 |4 |1/6 -------------------------------- 【結果】 親子テーブルを連結したSQLを実行すると -------------------------------- |品番 |品名 |食べた回数 -------------------------------- |1 |ラーメン|2 -------------------------------- |2 |カレー |0 -------------------------------- |3 |うどん |4 -------------------------------- のような結果が帰ってくるSQLが作成可能でしたらご教授いただけますようよろしくお願い致します。

  • MySQLとPostgreSQLについてのSQLインジェクション

    はじめて質問させていただきます。 よろしくお願いします。 現在、私は大学の研究テーマでデータベース(MySQL、PostgreSQL)を使っているCGIを自作し、それぞれのデータベースについてSQLインジェクションの脆弱性について調べる、という研究を行っています。 ブラインドSQLインジェクションについて調べているのですが、 PostgreSQLの場合、pg_tablesというテーブルにデータベースのテーブル一覧表がのっていて、それを参照することでテーブル名が取得でき、いろいろ悪いことができてしまいますが、MySQLの場合、ブラインドSQLインジェクションを起こそうと思った場合どのようなコマンドを使えばよいのでしょうか? SHOW TABLESで使用中のデータベースのテーブル一覧は取得できますが、それをクエリの一部として使うことはできるのでしょうか・・・? また、全く関係ない質問なのですが、このCGIはRubyで記述して作りました。Rubyにはプリペアドステートメントという機能があるのですが、これをデータベースにアクセスするすべての箇所で用いればSQLインジェクションは100%起きないといえるのでしょうか?(現在考え得る範囲でよいのでお願いします) 卒論で困っているので知っている方がおられましたらどうかよろしくお願いいたします。

  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

  • PHP+mysqlでSQL文に文字数制限はありますか?

    基本的な質問で申し訳ありません。 $sql="......";にSQL文を書き $rst = mysql_query($sql,$con); $col = mysql_fetch_array($rst); として($conはmysql_connect関数の結果です) WEBを作成しているのですが、ある程度以上長いSQL文を書くと正常に作動しません。(短いSQLであれば正常に差作動します。)  当然SQL文自体もmysqlで直接実行すると作動するものです。SQL文自体がUNIONや副問い合わせを多用し250行程度になってしまったためかと考えていますが、文字数制限等があるのでしょうか?PHPには変数宣言が無いと認識しているのでどう対処して良いかわかりません。 SQLを分解できないとすると何か良い方法はありますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQL文2つ実行

    SQL文を2つ実行したい場合、単にmysql_query()を2つ記述すればOkと記憶してましたが、動きませんでした。 なんか間違えてますか?

    • 締切済み
    • PHP
  • MySQLで集計後の値の合計方法について

    現在,MySQLを使用して,データベースを作成しています. 品番と,指定した期間以前のデータの数量を合計しようと思い,下記のようなSQLを実行してみました. select 品番,期間,sum(数量) as sumQuantity ftom 履歴 where 品番 = 'A' and 期間 <= '1302' group by 品番,期間 (期間は2013/02なら12/11になり,さらに / を除去した値です) 結果が添付図のようになりました. さらに,この結果のsumQuantityの合計を求めるにはどのようなSQLを記述すればよいでしょうか? サブクエリを使用するのかな?と思いましたが,うまく記述できませんでした. お分かりになられる方がいらっしゃいましたら,ご教授お願い致します.

    • ベストアンサー
    • MySQL
  • SQL文の質問です

    社員表(EMP表)と給与等級表(SALGRADE表)を結合したいのですが下記を実現するSQL文がわかりません。 SALGRADE表は等級(grade)、最低給(Losal)、最上給(Hisal)の3つを持っています。 EMP表の月給(Sal)と、SALGRADE表の最低給(Losal)と最上給(HIsal)とを照らし合わせて該当する等級(grade)をEMP表に結合したいのですが、適切なSQL文がありましたら教えてください。 基本的にはoracleを使用していますが、できればmysqlで実現可能なSQL文も合わせて教えてください。

  • SQL文を一気に入力したい

    データベースに今までのデータを入れるため、 SQL文で入力しようと思っています。 しかし、入力するデータ量が多いので、 ファイルから読み込んで実行しようと考えました。 そこで、以下のプログラムを書いたのですが、 なんだかうまくいきません。 どなたか教えていただけないでしょうか。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>データの追加</title></head> <body> <?php $host = "localhost"; if (!$conn = mysql_connect($host, "root", "pass")){ die("データベース接続エラー.<br />"); } mysql_select_db("service_db", $conn); $fp = @fopen('sample.txt','r'); $i = 0; while( $sql[$i] = fgets($fp,2048) ){ $sql[$i] = stripslashes($sql[$i]); // print $sql[$i]; mysql_query($sql[$i], $conn) or die ("登録できませんでした。".$i); $i++; } fclose($fp); ?> </body> </html> ※ファイルにはSQL文が1行にひとつ書かれています。 よろしくお願いします。

    • 締切済み
    • PHP
  • php+mysql sql文実行について

    データベースに「日付」「文章」を登録し、今日の日付に対応した文章が表示される仕組み(正確には朝の5時に変更)を作りたいと考えております。 以前は日付をタイトルとしたtxtファイルを作成し、その中身を読み込ませる仕組みだったのですが、今回mysqlを使用して同様のものを作成できればと思い試行錯誤しております。 データベースは 「maxim」というテーブルの中に、 date   main 071018 (文章)  071019 (文章) 071020 (文章) 071021 (文章) のように格納してあります。 date:主キー、varchar(6)、not null main:text、not null 作成したスクリプトは以下の通りですが、これを実行すると「エラー」が表示されてしまいます。 $dateによる文字列の取得、DBへの接続までは、echo、or dieにて確認済、またsql文をphpMyadminから実行した場合($dateを071018に書き換えて)、こちらも正常に取得できたのですが。 $dateをsql文に記述する際の囲みの問題かとも思い、「''」や「()」や「[]」で囲ってもみたのですがだめでした。 どなたかお知恵を拝借できますでしょうか。 宜しくお願い致します。 *サーバー、mysqlはともに「ロリポップ」を使用しております。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>テスト</title> </head> <body> <?php $date=strftime("%y%m%d",time()-5*3600); $server="mysql**.***.jp"; $dbname="********"; $user="********"; $pass="*****"; $conn = mysql_connect($server,$user,$pass); $sql="SELECT main FROM maxim WHERE date = '$date'"; $res=mysql_query($sql,$conn) or die("エラー"); echo "<b>$res</b>"; mysql_close($conn); ?> </body> </html>

    • ベストアンサー
    • PHP