web-dev-qa-db-ja.com

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

SQL Server 2008 INNER JOINを使用して削除したい。

しかし、私はこのエラーが出ます:

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

私のコード:

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

どのテーブルから削除するテーブルを指定する必要があります。これはエイリアス付きのバージョンです。

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

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

それで、あなたの最終的な質問はこのようになるべきです:

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

これを試して:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
26

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

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 ....
)
23
Devart

そのはず:

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

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

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

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

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';
7
Ali

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
6
frans eilering
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
5
Dhanraj Mittal

これを試してください、それは助けるかもしれません

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

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にしたい場合は、CTE内でdeleteを使用することはできません。

3

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

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

CompanyDateのテーブルを指定しないで、それを修正したいと思うかもしれません。

MERGEを使用した標準SQL

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による答えの中で最もよく説明されていると思います。すなわち、コードを書いている人はコードを読んで保守する人を必ずしも気にしません。

2
onedaywhen

これが私の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)
1
ozzy432836

これが私が現在削除や更新のために使っているものです。

DELETE FROM      w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
1
PPJN