web-dev-qa-db-ja.com

SQLのDELETEとDELETEFROMの違いは?

ありますか?私はいくつかのストアドプロシージャを調査していますが、ある場所で次の行を見つけました。

DELETE BI_Appointments
WHERE VisitType != (
    SELECT TOP 1 CheckupType
    FROM BI_Settings
    WHERE DoctorName = @DoctorName)

それは次と同じことをしますか:

DELETE FROM BI_Appointments
WHERE VisitType != (
    SELECT TOP 1 CheckupType
    FROM BI_Settings
    WHERE DoctorName = @DoctorName)

それとも構文エラーですか、それともまったく異なるものですか?

12
Joe M

これがT-SQLまたはMSSQL Serverであると仮定すると、違いはなく、ステートメントは同一です。最初のFROMキーワードは、DELETEステートメントでは構文的にオプションです。

http://technet.Microsoft.com/en-us/library/ms189835.aspx

キーワードは2つの理由でオプションです。

まず、標準では句にFROMキーワードが必要であるため、標準に準拠するためにそこに存在する必要があります。

第二に、キーワードは冗長ですが、それがオプションである理由ではないかもしれません。これは、SQLServerではJOINステートメントでDELETEを指定でき、最初のFROMを必須にすると扱いにくくなるためだと思います。

たとえば、通常の削除は次のとおりです。

DELETE FROM Employee WHERE ID = @value

そして、それは次のように短縮できます。

DELETE Employee WHERE ID = @value

また、SQL Serverでは、JOINを使用して別のテーブルに基づいて削除できます。

DELETE Employee
FROM Employee
    JOIN Site
       ON Employee.SiteID = Site.ID
WHERE Site.Status = 'Closed'

最初のFROMキーワードがオプションでない場合、上記の2番目のクエリは次のようになります。

DELETE FROM Employee
FROM Employee
    JOIN Site
       ON Employee.SiteID = Site.ID
WHERE Site.Status = 'Closed'

上記のクエリは完全に有効で実行されますが、読み取るのが非常に厄介なクエリです。それが単一のクエリであると言うのは難しいです。 「重複」FROM句が原因で、2つが一緒にマッシュされたように見えます。

補足:ORDER BY句がないため、サブクエリの例は潜在的に非決定論的です。

24
Bacon Bits

こんにちは友人、Oracleデータベースでの削除と削除の違いはありませんが、これはオプションですが、これは次のようなコードを書くための標準ですDELETE FROM table [ WHERE condition ]これはsql-92標準です。常に標準的な方法でコードを開発してください。

0
amirdavod