web-dev-qa-db-ja.com

WHERE条件を持つ単一のクエリ(SQL Express 2005)を使用して複数のテーブルから行を削除する

これは私が使用しているクエリです:

 DELETE TB1.*, TB2.*
   FROM TB1
        INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID 
  WHERE (TB1.PersonID)='2'

MS Accessでは正常に動作していますが、SQL Server Express 2005ではエラー(「、」付近の構文が正しくありません)が発生します。

解決方法助けてください。

19
Jobi

DELETE CASCADE FKを使用しない理由

11
Cesar

これを1つのステートメントで行うことはできません。 2つのステートメントを使用する必要があります

DELETE FROM TB1 WHERE PersonID = '2';
DELETE FROM TB2 WHERE PersonID = '2';
3
Adriaan Stander

マスターのプライマリキーを参照する詳細テーブルの外部キーを指定し、Delete rule = Cascadeを設定します。

これで、マスターテーブルからレコードを削除すると、削除行のプライマリキー値に基づく他のすべての詳細テーブルレコードが自動的に削除されます。

そのため、その場合、マスターテーブルの単一の削除クエリは、マスターテーブルデータと子テーブルデータを削除できます。

1
Himadri

一度に複数のテーブルから削除できるとは思いません(確かではありませんが)。

ただし、削除をカスケードする関係でこの効果を達成するのが最善であると私には思えます。これを行うと、1つのテーブルからレコードを削除でき、他のテーブルのレコードは自動的に削除されます。

例として、2つのテーブルが顧客と顧客の注文を表しているとします。リレーションシップをカスケード削除に設定すると、顧客テーブルのレコードを削除するだけで、注文は自動的に削除されます。

参照整合性制約のカスケード に関するMSDNドキュメントを参照してください。

1
Alex Deem

次のようなものを使用できます。

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name IN ("TB2","TB1")  -- use these databases

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   


WHILE @@FETCH_STATUS = 0   
BEGIN   

       DELETE FROM @name WHERE PersonID ='2'

       FETCH NEXT FROM db_cursor INTO @name   
END  
0
Yablargo
CREATE PROCEDURE sp_deleteUserDetails
    @Email varchar(255)
AS
    declare @tempRegId as int
    Delete UserRegistration where Email=@Email  
    set @tempRegId = (select Id from UserRegistration where Email = @Email)
    Delete UserProfile where RegID=@tempRegId

RETURN 0
0
Hari Kumar