web-dev-qa-db-ja.com

結合の条件に基づくSQL削除

結合クエリで満たされた条件に基づいてレコードを削除することは可能ですか?

たとえば、3つのレコードを結合するリンクテーブルがあります。私が現在持っているクエリは、IDの1つがIN()ではないPhp配列ではないこのテーブルからレコードを削除します。このIDが配列に存在せず、別のテーブルへのリンクに基づいて特定の他のテーブルに属している場合にのみ、クエリがこのテーブルからレコードを削除する必要があることに気付きました。

20
user275074

これにはEXISTS句を使用します。

DELETE FROM TableA
WHERE
  <<put your array condition here>> 
  AND NOT EXISTS 
  (SELECT 1 FROM TableB Where TableB.ID=TableA.ID)
10
Bill

SQL Serverの場合、コマンドは少し異なります。

DELETE FROM TableA
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL

いいえ、それはタイプミスではありません、はい、あなたはdo "FROM TableA" twiceが必要です。少なくとも、2番目のFROMが必要です(最初のFROMはオプションです)。以下は、SQL ServerとMySQLの両方で機能するという利点があります。

DELETE TableA
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL
28
Greg Dougherty

使用できます:

結合に基づく削除:

DELETE A      
FROM TableA AS A
  LEFT OUTER JOIN TableB As B ON A.Id = B.TabaleAId 
WHERE B.Column IS NULL

サブクエリで削除:

DELETE 
FROM TableA AS A
Where
    A.id not in ( Select B.TabaleAId From Tab;eB As B )

または

DELETE FROM TableA
WHERE Not EXISTS 
  (
    SELECT * 
    FROM TableB As B
    Where B.TableAId = TableA.Id
   )

テーブル式を使用した削除:

With A 
As
    (
        Select TableA.*
        FROM TableA AS A
            LEFT OUTER JOIN TableB As B ON A.Id = B.TabaleAId 
        WHERE B.Column IS NULL
    )
Delete From A
8
DELETE FROM TableA
LEFT OUTER JOIN TableB
WHERE TableB.Column IS NULL

TableBに対応するレコードがないtableAのレコードを削除します。それはあなたが求めているもののようなものですか?

5
JNK
DELETE FROM a
  FROM TableA AS a LEFT OUTER JOIN TableB AS b 
  on a.CALENDAR_DATE = b.CALENDAR_DATE AND a.ID = b.ID 
  Where b.ID is null

最初にselectステートメントを使用して、削除するレコードを確認し、次にselectステートメントを削除して、上記のクエリ構文でDelete FROM tablenameを追加します。

5
Chintan P

結合に基づいて削除する最も簡単な方法は次のとおりです。

1. SELECTステートメントの代わりにDELETEステートメントを使用してクエリを記述します

  SELECT COLUMNS
    FROM    Table1
            INNER JOIN Table2  ON Table1.YYY = Table2.XXX

2. SELECT COLUMNSをDELETE FROM TABLEに置き換えます

 DELETE  FROM Table1
    FROM    Table1
            INNER JOIN Table2 ON Table1.YYY = Table2.XXX

FROMを2回指定する必要があることに注意してください。1つはDELETE部分用で、もう1つはJOIN部分用です。

2
delete from TableA
where id in 
(
   select id from TableA
   except select id from TableB
)

これは、「テーブルAにIDがあり、テーブルBにないIDをテーブルAから削除する」という意味です。

そうでない場合、Mergeステートメントが役立つ場合があります(一致する/一致しない場合など) http://technet.Microsoft.com/en-us/library/bb510625.aspx

1
SilverSkin