SQL ServerでINNER JOINを使用して削除する方法


1283

SQL Server 2008INNER JOINで削除したい

しかし、私はこのエラーを受け取ります:

メッセージ156、レベル15、状態1、行15
キーワード「INNER」付近の構文が正しくありません。

私のコード:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

2
ドキュメントの例Cは、DELETE結合の使用方法を示しています
Pondlife

1
例Cでは、カーソルと無関係なものも使用しています
reggaeguitar

t1.id = t2.idのtable1 t1内部結合table2 t2からtable1から削除します。詳細youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

回答:


2241

削除するテーブルを指定する必要があります。ここでは、エイリアスを使用したバージョンを示します。

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

9
@bluefeetは、両方のテーブルから削除するためのSQL Serverの正しい構文を提供できますか?
oabarca 2014年

44
@ user2070775 SQL Serverで2つのテーブルから削除するには、2つの個別のステートメントを使用する必要があります。
タリン

8
示すように、@ user2070775 SQL Serverでは、あなたは、取引および擬似テーブルを使用することができますstackoverflow.com/questions/783726/...
マチューRodic

1
@MathieuRodic共有してくれてありがとう。私のセットアップでは、2つのテーブルから個別に削除した場合、2番目のテーブルから削除する行がわからなくなったため、これが役立ちます:)
Verena Haunschmid

2
WorkRecord2テーブルのエイリアスである@ShahryarSaljoughi。
タリン

151

削除するテーブルを指定する必要があるため、レコードを削除する場所の間DELETEFROM、そこからテーブルの名前を追加するだけです。また、ORDER BYレコードの削除中に順序付けするものがないため、句も削除します。

したがって、最終的なクエリは次のようになります。

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';

3
これは、最初のテーブルから削除するだけの場合にSQL Serverで機能します。
TroySteven 2018

1
@matwonk:2番目のテーブルの名前を使用する場合は、2番目のテーブルからtoを削除できます。たとえば、DELETE Employeeテーブルの代わりにを使用すると、従業員のテーブルから削除されWorkRecord2ます。
hims056

1
@matwonk:1):ここでは一例であり、第一のテーブルから削除 2)第二のテーブルから削除
hims056

30

これはあなたに役立つ可能性があります-

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

またはこれを試してください-

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)

1
これは、SQL Serverで機能する唯一の回答です。select Id from ... join ... joinなどのクエリを作成し、サブクエリとしてラップし、Id(in subquery)から(テーブル)から削除を実行します
Chris Moschini '29


16

そのはず:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       

11

このバージョンは動作するはずです

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'

11

SQL Server Management Studioでは、SELECTクエリを簡単に作成できます。

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

実行でき、すべての連絡先が表示されます。

をに変更SELECTしますDELETE

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

SELECTステートメントで確認したすべてのレコードが削除されます。

同じ手順で、さらに難しい内部結合を作成することもできます。次に例を示します。

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf


9

このクエリを試してください:

DELETE WorkRecord2, Employee 
FROM WorkRecord2 
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1' 
AND tbl_name.Date = '2013-05-06';

8
DELETEは1つのテーブルしか指定できないと確信しています。これは私にはうまくいきません。
Stealth Rabbi

3
mySQLで削除する複数のテーブルを指定できると思いますが、SQL Serverは指定できません(質問が表示されます)。
dandev91 2016

7

を使用する別の方法CTE

;WITH cte 
     AS (SELECT * 
         FROM   workrecord2 w 
         WHERE  EXISTS (SELECT 1 
                        FROM   employee e 
                        WHERE  employeerun = employeeno 
                               AND company = '1' 
                               AND date = '2013-05-06')) 
DELETE FROM cte 

注:必要な場合はJOIN内部を使用できません。CTEdelete


6

これは、2つのテーブルから一度にレコードを削除する単純なクエリです。

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'

2
この質問はSQL Server向けです。SQL Serverの1つのステートメントで2つのテーブルから削除することはできません。私の理解では、これ mysqlおよびMS Accessで実行できます。
ダレングリフィス

6

これを試してください、それが役立つかもしれません

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';

7
受け入れられた回答とはどう違いますか:stackoverflow.com/questions/16481379/…
デフォルトロケール

3
この回答では、エイリアシングではなく明示的なテーブルの命名を使用しているため、経験の浅い人にとっては、何が起こっているのかを/ catchで読み取るのが簡単になります。
ジョシュアバーンズ

1
@JoshuaBurns:私の答えの正確な複製。
hims056

4

ここに私のSQL Serverのバージョンがあります

DECLARE @ProfileId table(Id bigint)

DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email

DELETE FROM UserProfiles    
WHERE Id = (Select Id FROM @ProfileId)

4

Companyとのテーブルを指定しませんDate場合は、修正することができます。

標準SQLを使用MERGE

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

@Devartからの回答も標準SQLですが、不完全ですが、次のようになります。

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

上記について注意する重要な点は、削除が単一のテーブルをターゲットにしていることが明らかであることです。これは、2番目の例でスカラーサブクエリを要求することによって適用されます。

私にとって、さまざまな独自の構文の答えは読みにくく、理解しにくいものです。私の考え方は@frans eileringの回答で最もよく説明されていると思います。つまり、コードを書く人は、コードを読んで維持する人を必ずしも気にする必要はありません。


4

これは私が現在削除または更新に使用しているものです:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.