3

私は SQL Server にかなり慣れていませんが、まだいくつかの取引のコツを学んでいます。私に教えてくれた他の人は、その週は仕事をしていません。通常、最初に彼のステートメントを実行してから実行します。

私がやろうとしているのは、この選択ステートメントで返されるすべてのものを削除することです:

SELECT * from LOCATIONS a Join CONTACTS b on a.location_ID = b.Location_ID 
join CONTACTS_SOURCES c on b.contact_ID = c.Contact_ID  where c.Source_ID = 10014918

CONTACTS テーブルと LOCATIONS テーブルの両方から、このステートメントが返すものを削除する必要があります。これを行う場合、どのルートを取るのが最適なルートでしょうか?

ルート A:

delete from LOCATIONS a
Join CONTACTS b
on a.location_ID = b.Location_ID
join CONTACTS_SOURCES c
on b.contact_ID = c.Contact_ID  where c.Source_ID = 10014918

またはBルート。

DELETE from LOCATIONS where (SELECT * from LOCATIONS a
Join CONTACTS b
on a.location_ID = b.Location_ID
join CONTACTS_SOURCES c
on b.contact_ID = c.Contact_ID  where c.Source_ID = 10014918)

DELETE FROM CONTACTS where (SELECT * from LOCATIONS a
Join CONTACTS b
on a.location_ID = b.Location_ID
join CONTACTS_SOURCES c
on b.contact_ID = c.Contact_ID  where c.Source_ID = 10014918)

ルート A. は LOCATIONS および CONTACTS テーブルから削除されない気がします。

4

2 に答える 2

7

あなたの気持ちは正しいです:DELETEクエリ(実際には任意のDMLクエリ)は単一のテーブルにのみ影響を与えることができます。ルートBの問題は、最初のクエリが結合の候補となるすべての行を削除したため、2番目のクエリが機能しないことです。

どうですか:

SELECT l.Location_ID, c.Contact_ID
  INTO #x
  FROM dbo.LOCATIONS AS l
  INNER JOIN dbo.CONTACTS AS c
  ON l.location_ID = c.Location_ID
  INNER JOIN dbo.CONTACTS_SOURCES AS cs
  ON c.contact_ID = cs.Contact_ID 
  WHERE cs.Source_ID = 10014918;

DELETE dbo.CONTACTS_SOURCES WHERE Contact_ID IN (SELECT Contact_ID FROM #x);

DELETE dbo.CONTACTS WHERE Contact_ID IN (SELECT Contact_ID FROM #x);

DELETE dbo.LOCATIONS WHERE Location_ID IN (SELECT Location_ID FROM #x);     
于 2012-09-06T19:20:24.573 に答える
1

3 つすべてのテーブル (連絡先、場所、連絡先ソース) に参照整合性がある場合は、リーフから親への順序で削除する必要があります。

  1. Contact_sources
  2. 連絡先
  3. 場所
于 2012-09-06T19:23:14.710 に答える