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'
どのテーブルから削除するテーブルを指定する必要があります。これはエイリアス付きのバージョンです。
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
削除するテーブルを指定する必要があるため、レコードを削除する場所からDELETE
とFROM
の間にテーブルの名前を追加するだけです。レコードの削除中には何も注文する必要がないため、ORDER BY
句も削除します。
それで、あなたの最終的な質問はこのようになるべきです:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
これを試して:
DELETE FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = '1'
AND Date = '2013-05-06'
これはあなたにとって役立つ可能性があります -
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 ....
)
そのはず:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
このバージョンは動作するはずです
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
このクエリを試してください。
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';
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
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = '1'
AND a.Date = '2013-05-06'
これを試してください、それは助けるかもしれません
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
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
を使用することはできません。
これは、一度に2つのテーブルからレコードを削除するための単純なクエリです。
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Company
とDate
のテーブルを指定しないで、それを修正したいと思うかもしれません。
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による答えの中で最もよく説明されていると思います。すなわち、コードを書いている人はコードを読んで保守する人を必ずしも気にしません。
これが私の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)
これが私が現在削除や更新のために使っているものです。
DELETE FROM w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'