こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

宜しくお願いします。

投稿日時 - 2012-04-02 23:14:40

QNo.7398988

困ってます

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

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

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

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

投稿日時 - 2012-04-03 00:24:17

お礼

ありがとうございます!

投稿日時 - 2012-04-05 08:44:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

ANo.4

DELETE FROM 社員マスタ
WHERE EXISTS
( SELECT 1 FROM 組織マスタ b
WHERE 社員マスタ.部署コード = b.部署コード )

投稿日時 - 2012-04-03 12:20:37

お礼

速そうですね!
ありがとうございます
DELETE対象には別名をつけない点も参考になりました

投稿日時 - 2012-04-05 08:51:36

ANo.3

(1) EXISTSを使う方法

DELETE FROM 社員マスタ WHERE EXISTS(SELECT 1 FROM 組織マスタ b WHERE 社員マスタ.部署コード = b.部署コード)

※DELETE のテーブルは別名が使えない

(2) INを使う方法

DELETE FROM 社員マスタ WHERE 部署コード (SELECT DISTRICT 部署コード FROM 組織マスタ)

投稿日時 - 2012-04-03 12:19:28

お礼

やはりDELETEの対象テーブルには別名が使えないんですね…
ありがとうございます!

投稿日時 - 2012-04-10 07:45:29

ANo.2

DELETE FROM
社員マスタ
WHERE
部署コード IN(SELECT 部署コード FROM 組織マスタ)
ではどうでしょうか。

投稿日時 - 2012-04-03 09:48:32

お礼

わかりやすいです!
ありがとうございます

投稿日時 - 2012-04-05 08:46:20

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-