【無料配信♪】Renta !全タテコミ作品第1話

下記のような2つのテーブルがあり、
仕入れテーブルから、2014/1/2にBさんが仕入れたデータを
削除したいのですが、SQLが分かりません。

どのようなSQLにすると実現することができるでしょうか。

「一致するデータのみ削除したい」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (6件)

delete 仕入れテーブル where (商品,規格) in (select 商品,規格 from 商品テーブル where 担

当 = 'Bさん')
    • good
    • 0
この回答へのお礼

ありがとうございます!!!!

お礼日時:2014/11/20 14:15

問題は「コーラ」が「コカ・コーラ」と同値かどうかです


それによって書き方がだいぶ違います
    • good
    • 0
この回答へのお礼

あ!それまちがいです。
商品名には同一値が入ります。
質問が適切でなかったです。すみません。

お礼日時:2014/11/20 17:59

重要なことは担当フィールドの無い仕入れテーブルから担当をどうやって


判断するかです。
規格と数量の組み合わせで担当者が1意に限定できるのならば、それで結合した
ビューを作ればいいのです。それならば簡単に削除できます
逆に、1意に限定できなければ1つずつ手作業でやるしかありません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/11/20 14:14

where句をとりあえずは、勉強して、SELECT, DELETEとの組み合わせ例を読むといいと思うよ。


外部結合とか内部結合は時間をかけて理解するほうがいいけど、テーブル数が極端に少ないときはあんまり必要なさそうな。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
SQL難しいです。がんばって勉強してみます

お礼日時:2014/11/20 14:14

担当者テーブルからは、お茶以外はBさんが担当とわかるので、仕入れテーブルから、当該日付、かつ、お茶じゃないレコードを抽出できれば、それらのレコードを削除できるよ。


ほかの考え方としては、担当者テーブルからBさん担当の商品種別名と、仕入れテーブルの商品名と部分一致するレコードを抽出して、削除。
MySQLの本かなんかで、SELECT, DELETEについて目を通せば参考になるよ。テーブル名、フィールド名、フィールドのデータ型に注意。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ループでぐるぐる回せば、削除できるんですが
SQLで一括で削除したいのです。

お礼日時:2014/11/19 22:34

DB設計がダメです。


仕入れテーブルには担当者のフィールドが必要です。

現状のDBでは、商品フィールドと企画フィールドから推測するしかありません。
もし、商品と企画の2つでデータを一意に限定できるものでしたら、delete文の
where 式に2つのフィールドについて条件を書けばいいのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
DB設計が変えられないので難儀しております。
in句などを使ってできないでしょうか。。

お礼日時:2014/11/19 22:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQL、2つのテーブルで条件一致したものだけdeleteする方法は?

オラクルSQLで質問です

やりたいことは、
テーブルAから以下の条件に該当するデータを削除する。
基本的にはテーブルBの内容と比較して、一致したもの。

条件(全ての条件を満たすこと)
 テーブルA.AAA = テーブルB.AAA
 テーブルA.BBB = テーブルB.BBB
 テーブルB.CCC > 0


調べたところ、SQLサーバでは以下のように
from を2つ書いて実現できるようです。
が、今回はオラクルなので文法エラーになります。

delete FROM テーブルA FROM テーブルB
where
テーブルA.AAA = テーブルB.AAA
AND
テーブルA.BBB = テーブルB.BBB
AND
テーブルA.CCC > 0
;
commit;


よろしくお願いします

Aベストアンサー

delete 文の細かい構文はちょっと覚えてませんが
サブクエリ使えばいいんじゃないですか

delete from table_a
where 主キーカラム = (
select table_a.主キーカラム
from table_a, table_b
where
指定の条件
)

Q2つのテーブルに共通するレコードを削除したい

2つのテーブルがあり、両方にID番号フィールドが存在しています。
Aテーブルは元のデータ
Bテーブルは削除したいレコードのID番号
という構成になっているとき、
AテーブルとBテーブルの共通するレコードを削除するにはどうすればよいでしょうか。

ものすごく単純な質問で申し訳ないのですが...宜しくお願いします

Aベストアンサー

1、テーブル内容
 Aテーブル フィールド:ID番号、・・
 Bテーブル フィールド:削除番号、・・

2、まず、選択クエリで削除したいIDのサブクエリを作る。
  ・AテーブルとBテーブルのIDを結合。
  ・表示のSQLでサブクエリをゲット
   内容は
     SELECT Aテーブル.ID番号
     FROM Aテーブル INNER JOIN Bテーブル
ON Aテーブル.ID番号 = Bテーブル.削除ID;   

3、次に削除クエリを作成
  ・新規クエリで削除クエリを作成
  ・Aテーブルのみ選択
  ・ID番号を下にドラッグ
  ・その抽出条件に2で作成したサブクエリを「;」を外して
   IN (  )をつけて入力
   内容は
     IN (SELECT Aテーブル.ID番号
     FROM Aテーブル INNER JOIN Bテーブル
     ON Aテーブル.ID番号 = Bテーブル.削除ID)

 これで、クエリを実行することにより、Aテーブルの内容が、
 Bテーブルの削除番号と同じID番号のレコードを削除できます。

1、テーブル内容
 Aテーブル フィールド:ID番号、・・
 Bテーブル フィールド:削除番号、・・

2、まず、選択クエリで削除したいIDのサブクエリを作る。
  ・AテーブルとBテーブルのIDを結合。
  ・表示のSQLでサブクエリをゲット
   内容は
     SELECT Aテーブル.ID番号
     FROM Aテーブル INNER JOIN Bテーブル
ON Aテーブル.ID番号 = Bテーブル.削除ID;   

3、次に削除クエリを作成
  ・新規クエリで削除クエリを作成
  ・Aテーブルのみ選択
...続きを読む

QEXISTSを使った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のカウントオプションで表示されているものなので間違いないです。

宜しくお願いします。

Aベストアンサー

EXISTS 句は、副問い合わせが行を返した場合 TRUE そうでない場合 FALSE と評価されます。

例示いただいた副問い合わせは TRUE を返すので DELETE されます。

詳細については、SQLの入門書を参考にしてください。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q片方のテーブルに無いデータを削除したい

過去ログを探っていろいろ試したのですが、うまくいかないので
教えてください。
TABLE1 に存在しない TABLE2 のデータをDELETEしたいのですが
TABLE2 の対象年月(item2の内容)が、指定年月以上の条件で
DELETEしたいのです。

●指定月=2008/02 の場合

<TABLE1>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12

<TABLE2>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12
d   d   d   え   2008/01 (削除しない)
e   e   e   お   2008/03 (削除対象)

<DELETE結果 TABLE2>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12
d   d   d   え   2008/01

よろしくお願いします。
(環境:SQL Server2005 Standard)

過去ログを探っていろいろ試したのですが、うまくいかないので
教えてください。
TABLE1 に存在しない TABLE2 のデータをDELETEしたいのですが
TABLE2 の対象年月(item2の内容)が、指定年月以上の条件で
DELETEしたいのです。

●指定月=2008/02 の場合

<TABLE1>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12

<TABLE2>
key1 key1 key1 item1  item2
a   a   a   あ...続きを読む

Aベストアンサー

SQL Server の場合、よく使うのは3パターンです。
状況に応じ使い分けられると便利なので、一応3つ書いときます。

--JOIN
DELETE TABLE2
FROM TABLE2 t2
LEFT OUTER JOIN TABLE1 t1 ON t1.KEY1=t2.KEY1 AND t1.KEY2=t2.KEY2 AND t1.KEY3=t2.KEY3
WHERE t1.KEY1 IS NULL
AND t2.ITEM2>='2008/02'

--EXISTS Clause
DELETE TABLE2
FROM TABLE2 t2
WHERE NOT EXISTS
(SELECT NULL FROM TABLE1 t1
WHERE t1.KEY1=t2.KEY1 AND t1.KEY2=t2.KEY2 AND t1.KEY3=t2.KEY3)
AND t2.ITEM2>='2008/02'

--IN Clause
DELETE FROM TABLE2
WHERE KEY1+'*'+KEY2+'*'+KEY3 NOT IN
(SELECT KEY1+'*'+KEY2+'*'+KEY3 FROM TABLE1)
AND ITEM2>='2008/02'

SQL Server の場合、よく使うのは3パターンです。
状況に応じ使い分けられると便利なので、一応3つ書いときます。

--JOIN
DELETE TABLE2
FROM TABLE2 t2
LEFT OUTER JOIN TABLE1 t1 ON t1.KEY1=t2.KEY1 AND t1.KEY2=t2.KEY2 AND t1.KEY3=t2.KEY3
WHERE t1.KEY1 IS NULL
AND t2.ITEM2>='2008/02'

--EXISTS Clause
DELETE TABLE2
FROM TABLE2 t2
WHERE NOT EXISTS
(SELECT NULL FROM TABLE1 t1
WHERE t1.KEY1=t2.KEY1 AND t1.KEY2=t2.KEY2 AND t1.KEY3=t2.KEY3)
AND t2.ITEM2>='2008/02'

...続きを読む

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q2つの項目が重複するレコードを抽出する方法はありますか?

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

Aベストアンサー

select * from `test`
where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)

QSQL文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=B.店コード);

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング