DELETE (Transact-SQL)DELETE (Transact-SQL)

適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

SQL ServerSQL Server のテーブルまたはビューから 1 つ以上の行を削除します。Removes one or more rows from a table or view in SQL ServerSQL Server.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions


-- Syntax for SQL Server and Azure SQL Database  
[ WITH <common_table_expression> [ ,...n ] ]  
    [ TOP ( expression ) [ PERCENT ] ]   
    [ FROM ]   
    { { table_alias  
      | <object>   
      | rowset_function_limited   
      [ WITH ( table_hint_limited [ ...n ] ) ] }   
      | @table_variable  
    [ <OUTPUT Clause> ]  
    [ FROM table_source [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                   { { [ GLOBAL ] cursor_name }   
                       | cursor_variable_name   
    [ OPTION ( <Query Hint> [ ,...n ] ) ]   
[; ]  
<object> ::=  
    [ server_name.database_name.schema_name.   
      | database_name. [ schema_name ] .   
      | schema_name.  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  


WITH <common_table_expression>WITH <common_table_expression>
DELETE ステートメントのスコープ内で定義された、一時的な名前付き結果セット (共通テーブル式とも呼ばれる) を指定します。Specifies the temporary named result set, also known as common table expression, defined within the scope of the DELETE statement. 結果セットは SELECT ステートメントから派生します。The result set is derived from a SELECT statement.

共通テーブル式は、SELECT、INSERT、UPDATE、CREATE VIEW の各ステートメントでも使用できます。Common table expressions can also be used with the SELECT, INSERT, UPDATE, and CREATE VIEW statements. 詳細については、「WITH common_table_expression (Transact-SQL)」を参照してください。For more information, see WITH common_table_expression (Transact-SQL).

TOP ( expression ) [ PERCENT ]TOP (expression) [ PERCENT ]
削除するランダムな行数または比率 (%) を指定します。Specifies the number or percent of random rows that will be deleted. expression は行数または行の比率 (%) にすることができます。expression can be either a number or a percent of the rows. INSERT、UPDATE、または DELETE を使用する TOP 式で参照される行は、順序付けされません。The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. 詳細については、「TOP (Transact-SQL)」を参照してください。For more information, see TOP (Transact-SQL).

DELETE キーワードと対象の table_or_view_name または rowset_function_limited の間で使用できる、省略可能なキーワードです。An optional keyword that can be used between the DELETE keyword and the target table_or_view_name, or rowset_function_limited.

FROM table_source 句で指定される別名です。行を削除するテーブルまたはビューを表します。The alias specified in the FROM table_source clause representing the table or view from which the rows are to be deleted.

適用対象: SQL Server 2008SQL Server 2008 以降。Applies to: SQL Server 2008SQL Server 2008 and later.

テーブルまたはビューがあるサーバー名 (リンクされたサーバー名またはサーバー名として OPENDATASOURCE 関数を使用) です。The name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. server_name が指定されている場合、database_nameschema_name が必要です。If server_name is specified, database_name and schema_name are required.

データベースの名前。The name of the database.

テーブルまたはビューが属するスキーマの名前です。The name of the schema to which the table or view belongs.

行を削除するテーブルまたはビューの名前です。The name of the table or view from which the rows are to be removed.

テーブル変数は、そのスコープ内では、DELETE ステートメントでテーブル ソースとしても使用できます。A table variable, within its scope, also can be used as a table source in a DELETE statement.

table_or_view_name が参照するビューは更新可能であることが条件となります。また、そのビュー定義の FROM 句ではベース テーブルを 1 つだけ参照している必要があります。The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view definition. 更新可能なビューの詳細については、「CREATE VIEW (Transact-SQL)」を参照してください。For more information about updatable views, see CREATE VIEW (Transact-SQL).

適用対象: SQL Server 2008SQL Server 2008 以降。Applies to: SQL Server 2008SQL Server 2008 and later.

プロバイダーの機能によって、OPENQUERY 関数、または OPENROWSET 関数のどちらかです。Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <table_hint_limited> [... n] )WITH ( <table_hint_limited> [... n] )
対象のテーブルに設定可能なテーブル ヒントを 1 つ以上指定します。Specifies one or more table hints that are allowed for a target table. キーワード WITH とかっこが必要です。The WITH keyword and the parentheses are required. NOLOCK および READUNCOMMITTED は指定できません。NOLOCK and READUNCOMMITTED are not allowed. テーブル ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information about table hints, see Table Hints (Transact-SQL).

DELETE 操作の一部として、削除された行または行に基づく式を返します。Returns deleted rows, or expressions based on them, as part of the DELETE operation. OUTPUT 句は、ビューまたはリモート テーブルを対象とする DML ステートメントではサポートされません。The OUTPUT clause is not supported in any DML statements targeting views or remote tables. 詳細については、「OUTPUT 句 (Transact-SQL)」を参照してください。For more information, see OUTPUT Clause (Transact-SQL).

FROM table_sourceFROM table_source
追加の FROM 句を指定します。Specifies an additional FROM clause. DELETE に追加されたこの Transact-SQLTransact-SQL 拡張機能では、<table_source> のデータを指定して、最初の FROM 句のテーブルから対応する行を削除できます。This Transact-SQLTransact-SQL extension to DELETE allows specifying data from <table_source> and deleting the corresponding rows from the table in the first FROM clause.

WHERE 句内のサブクエリを使用する代わりに、この拡張機能で結合を指定して、削除する行を特定できます。This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.

詳細については、「FROM (Transact-SQL)」を参照してください。For more information, see FROM (Transact-SQL).

削除する行数を制限するときに使用する条件を指定します。Specifies the conditions used to limit the number of rows that are deleted. WHERE 句を指定しない場合は、DELETE によってテーブルからすべての行が削除されます。If a WHERE clause is not supplied, DELETE removes all the rows from the table.

WHERE 句に指定する内容によって、削除操作は次の 2 種類に分けられます。There are two forms of delete operations based on what is specified in the WHERE clause:

  • 検索結果削除。削除する行を限定する検索条件を指定します。Searched deletes specify a search condition to qualify the rows to delete. たとえば、WHERE column_name = value のように使います。For example, WHERE column_name = value.

  • 位置指定削除。CURRENT OF 句を使用してカーソルを指定します。Positioned deletes use the CURRENT OF clause to specify a cursor. 削除操作は、カーソルの現在の位置で発生します。The delete operation occurs at the current position of the cursor. 位置指定削除は、WHERE search_condition 句によって削除する行を限定する、検索結果削除の DELETE ステートメントよりも正確です。This can be more accurate than a searched DELETE statement that uses a WHERE search_condition clause to qualify the rows to be deleted. 検索結果削除の DELETE ステートメントでは、検索条件で 1 つの行が一意に識別されない場合、複数の行が削除されます。A searched DELETE statement deletes multiple rows if the search condition does not uniquely identify a single row.

削除する行を制限する条件を指定します。Specifies the restricting conditions for the rows to be deleted. 検索条件に含まれる述語の数に制限はありません。There is no limit to the number of predicates that can be included in a search condition. 詳しくは、「検索条件 (Transact-SQL)」をご覧ください。For more information, see Search Condition (Transact-SQL).

指定したカーソルの現在位置で DELETE を実行します。Specifies that the DELETE is performed at the current position of the specified cursor.

cursor_name でグローバル カーソルを参照することを指定します。Specifies that cursor_name refers to a global cursor.

フェッチが行われるオープン カーソルの名前を指定します。Is the name of the open cursor from which the fetch is made. cursor_name という名前のグローバル カーソルとローカル カーソルの両方がある場合、GLOBAL を指定すると、この引数はグローバル カーソルを参照します。GLOBAL を指定しないと、この引数はローカル カーソルを参照します。If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. カーソルは、更新可能である必要があります。The cursor must allow updates.

カーソル変数の名前を指定します。The name of a cursor variable. カーソル変数は、更新可能なカーソルを参照する必要があります。The cursor variable must reference a cursor that allows updates.

OPTION ( <query_hint> [ , ... n] )OPTION ( <query_hint> [ ,... n] )
データベース エンジンDatabase Engineのステートメント処理をカスタマイズするためのオプティマイザー ヒントを示すキーワードです。Keywords that indicate which optimizer hints are used to customize the way the データベース エンジンDatabase Engine processes the statement. 詳細については、「クエリ ヒント (Transact-SQL)」を参照してください。For more information, see Query Hints (Transact-SQL).

ベスト プラクティスBest Practices

テーブル内のすべての行を削除するには、TRUNCATE TABLE を使用します。To delete all the rows in a table, use TRUNCATE TABLE. DELETE と比べると TRUNCATE TABLE の方が高速で、システムとトランザクション ログのリソース使用量も少なくて済みます。TRUNCATE TABLE is faster than DELETE and uses fewer system and transaction log resources. TRUNCATE TABLE には制限があり、たとえば、テーブルがレプリケーションに参加することはできません。TRUNCATE TABLE has restrictions, for example, the table cannot participate in replication. 詳細については、「TRUNCATE TABLE (Transact-SQL)」を参照してください。For more information, see TRUNCATE TABLE (Transact-SQL)

@@ROWCOUNT 関数を使用して、削除される行数をクライアント アプリケーションに返します。Use the @@ROWCOUNT function to return the number of deleted rows to the client application. 詳細については、「@@ROWCOUNT (Transact-SQL)」を参照してください。For more information, see @@ROWCOUNT (Transact-SQL).

エラー処理Error Handling

TRY...CATCH 構造でステートメントを指定することで、DELETE ステートメントのエラー処理を実装できます。You can implement error handling for the DELETE statement by specifying the statement in a TRY...CATCH construct.

DELETE ステートメントは、トリガーに違反したり、FOREIGN KEY 制約で別のテーブル内のデータによって参照されている行を削除しようとすると、失敗する可能性があります。The DELETE statement may fail if it violates a trigger or tries to remove a row referenced by data in another table with a FOREIGN KEY constraint. DELETE で複数の行を削除するときに、削除される行のいずれかがトリガーや制約に違反すると、ステートメントは取り消され、エラーが返されます。行は削除されません。If the DELETE removes multiple rows, and any one of the removed rows violates a trigger or constraint, the statement is canceled, an error is returned, and no rows are removed.

DELETE ステートメントで式の評価中に算術エラー (オーバーフロー、0 による除算、またはドメイン エラー) が発生すると、データベース エンジンDatabase Engineでは SET ARITHABORT が ON に設定されている場合と同様にこれらのエラーが処理されます。When a DELETE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the データベース エンジンDatabase Engine handles these errors as if SET ARITHABORT is set ON. 残りのバッチは取り消され、エラー メッセージが返されます。The rest of the batch is canceled, and an error message is returned.


変更するオブジェクトがテーブル変数の場合は、ユーザー定義関数内で DELETE を使用できます。DELETE can be used in the body of a user-defined function if the object modified is a table variable.

FILESTREAM 列を含む行を削除すると、その基となるファイル システム ファイルも削除されます。When you delete a row that contains a FILESTREAM column, you also delete its underlying file system files. 基になるファイルは、FILESTREAM ガベージ コレクターによって削除されます。The underlying files are removed by the FILESTREAM garbage collector. 詳しくは、「Transact-SQL による FILESTREAM データへのアクセス」をご覧ください。For more information, see Access FILESTREAM Data with Transact-SQL.

INSTEAD OF トリガーが定義されているビューを直接または間接的に参照している DELETE ステートメントでは、FROM 句は指定できません。The FROM clause cannot be specified in a DELETE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. INSTEAD OF トリガーの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

制限事項と制約事項Limitations and Restrictions

TOP を DELETE と共に使用する場合、参照される行は任意の順序に並べられません。また、このステートメントで、ORDER BY 句を直接指定することはできません。When TOP is used with DELETE, the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statement. TOP を使用して、意味のある順序で行を削除する必要がある場合は、サブセレクト ステートメントで ORDER BY 句を指定して TOP を使用する必要があります。If you need to use TOP to delete rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause in a subselect statement. 例については、後の「例」のセクションを参照してください。See the Examples section that follows in this topic.

パーティション ビューに対して DELETE ステートメントで TOP を使用することはできません。TOP cannot be used in a DELETE statement against partitioned views.

ロック動作Locking Behavior

既定では、DELETE ステートメントは、常に、そのステートメントで変更するテーブルについて排他 (X) ロックを獲得し、トランザクションが完了するまでそのロックを保持します。By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. 排他 (X) ロックをかけたトランザクション以外はデータを変更できませんが、NOLOCK ヒントまたは READ UNCOMMITTED 分離レベルが指定されている場合に限り、読み取り操作は行うことができます。With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level. 別のロック手法を指定することで DELETE ステートメントの期間のこの既定の動作をオーバーライドするテーブル ヒントを指定できます。ただし、このヒントは、経験豊富な開発者およびデータベース管理者が最後の手段としてのみ使用することを推奨します。You can specify table hints to override this default behavior for the duration of the DELETE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. 詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information, see Table Hints (Transact-SQL).

ヒープから行を削除するときには、 データベース エンジンDatabase Engine によって、操作に行またはページ ロックが使用されることがあります。When rows are deleted from a heap the データベース エンジンDatabase Engine may use row or page locking for the operation. その結果、削除操作で空になったページがヒープに割り当てられたままになります。As a result, the pages made empty by the delete operation remain allocated to the heap. 空のページの割り当てが解除されないと、データベース内の他のオブジェクトで該当の領域を再利用できなくなります。When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

ヒープ内の行を削除し、ページの割り当てを解除するには、次のいずれかの方法を使用します。To delete rows in a heap and deallocate pages, use one of the following methods.

  • DELETE ステートメントで TABLOCK ヒントを指定します。Specify the TABLOCK hint in the DELETE statement. TABLOCK ヒントを使用すると、削除操作では、行またはページ ロックではなく、テーブルの排他的ロックが取得されます。Using the TABLOCK hint causes the delete operation to take an exclusive lock on the table instead of a row or page lock. これにより、ページの割り当てを解除できるようになります。This allows the pages to be deallocated. TABLOCK ヒントについて詳しくは、「テーブル ヒント (Transact-SQL)」をご覧ください。For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

  • テーブルからすべての行を削除する場合は、TRUNCATE TABLE を使用します。Use TRUNCATE TABLE if all rows are to be deleted from the table.

  • 行を削除する前に、ヒープにクラスター化インデックスを作成します。Create a clustered index on the heap before deleting the rows. 作成したクラスター化インデックスは、行を削除した後、削除できます。You can drop the clustered index after the rows are deleted. この方法は前の 2 つの方法より時間がかかり、一時リソースがより多く使用されます。This method is more time consuming than the previous methods and uses more temporary resources.


空のページは、いつでも ALTER TABLE <table_name> REBUILD ステートメントを使ってヒープから削除できます。Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.

ログ記録の動作Logging Behavior

DELETE ステートメントは、常に完全にログに記録されます。The DELETE statement is always fully logged.



対象テーブルに対する DELETE 権限が必要です。DELETE permissions are required on the target table. ステートメントに WHERE 句が含まれる場合は、SELECT 権限も必要です。SELECT permissions are also required if the statement contains a WHERE clause.

DELETE 権限は、既定では sysadmin 固定サーバー ロール、db_owner 固定データベース ロール、および db_datawriter 固定データベース ロールのメンバーと、テーブル所有者に与えられています。DELETE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. sysadmindb_owner、および db_securityadmin ロールのメンバー、およびテーブル所有者は、他のユーザーに権限を譲渡できます。Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.


カテゴリCategory 主な構文要素Featured syntax elements
基本構文Basic syntax DELETEDELETE
削除する行数を制限するLimiting the rows deleted WHERE、FROM、カーソルWHERE • FROM • cursor •
リモート テーブルから行を削除するDeleting rows from a remote table リンク サーバー、OPENQUERY 行セット関数、OPENDATASOURCE 行セット関数Linked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
DELETE ステートメントの結果をキャプチャするCapturing the results of the DELETE statement OUTPUT 句OUTPUT clause

基本構文Basic Syntax

このセクションの例では、最低限必要な構文を使用して DELETE ステートメントの基本機能を示します。Examples in this section demonstrate the basic functionality of the DELETE statement using the minimum required syntax.

A.A. WHERE 句を指定せずに DELETE を使用するUsing DELETE with no WHERE clause

次の例では、削除する行数を制限する WHERE 句が指定されていないため、 SalesPersonQuotaHistory データベース内の AdventureWorks2012AdventureWorks2012 テーブルからすべての行が削除されます。The following example deletes all rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Sales.SalesPersonQuotaHistory;  

削除する行数を制限するLimiting the Rows Deleted

このセクションの例では、削除する行数を制限する方法を示します。Examples in this section demonstrate how to limit the number of rows that will be deleted.

B.B. WHERE 句を使用して行セットを削除するUsing the WHERE clause to delete a set of rows

次の例は、 ProductCostHistory 列の値が AdventureWorks2012AdventureWorks2012 より大きいすべての行を StandardCost データベース内の 1000.00テーブルから削除します。The following example deletes all rows from the ProductCostHistory table in the AdventureWorks2012AdventureWorks2012 database in which the value in the StandardCost column is more than 1000.00.

DELETE FROM Production.ProductCostHistory  
WHERE StandardCost > 1000.00;  

次の例では、より複雑な WHERE 句を示します。The following example shows a more complex WHERE clause. WHERE 句では、削除する行を決定するために満たす必要がある 2 つの条件を定義しています。The WHERE clause defines two conditions that must be met to determine the rows to delete. StandardCost 列の値が 12.00 から 14.00 までの範囲に含まれ、 SellEndDate 列の値が NULL であることが必要です。The value in the StandardCost column must be between 12.00 and 14.00 and the value in the column SellEndDate must be null. この例では、削除される行数を返す @@ROWCOUNT 関数から値も出力されます。The example also prints the value from the @@ROWCOUNT function to return the number of deleted rows.

DELETE Production.ProductCostHistory  
WHERE StandardCost BETWEEN 12.00 AND 14.00  
      AND EndDate IS NULL;  
PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));  

C.C. カーソルを使用して削除する行を決定するUsing a cursor to determine the row to delete

次の例は、my_cursor というカーソルを使用している 1 行を AdventureWorks2012AdventureWorks2012 データベース内の EmployeePayHistory テーブルから削除します。The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named my_cursor. この操作では、カーソルから現在フェッチされている 1 行だけが削除されます。The delete operation affects only the single row currently fetched from the cursor.

DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
DELETE FROM HumanResources.EmployeePayHistory  
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  

D.D. 1 つのテーブルへの結合およびサブクエリを使用して、別のテーブルの行を削除するUsing joins and subqueries to data in one table to delete rows in another table

次の例では、1 つのテーブル内の行を、別のテーブルのデータに基づいて削除する 2 つの方法を示します。The following examples show two ways to delete rows in one table based on data in another table. どちらの例も、SalesPerson テーブルに格納されている今年に入ってからの売り上げに基づいて、AdventureWorks2012AdventureWorks2012 データベース内の SalesPersonQuotaHistory テーブルから行を削除します。In both examples, rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database are deleted based on the year-to-date sales stored in the SalesPerson table. 最初の DELETE ステートメントは ISO 互換のサブクエリ ソリューションを示しています。また、2 つ目の DELETE ステートメントは、2 つのテーブルを結合する Transact-SQLTransact-SQL FROM 拡張機能を示しています。The first DELETE statement shows the ISO-compatible subquery solution, and the second DELETE statement shows the Transact-SQLTransact-SQL FROM extension to join the two tables.

-- SQL-2003 Standard subquery  
DELETE FROM Sales.SalesPersonQuotaHistory   
WHERE BusinessEntityID IN   
    (SELECT BusinessEntityID   
     FROM Sales.SalesPerson   
     WHERE SalesYTD > 2500000.00);  
-- Transact-SQL extension  
DELETE FROM Sales.SalesPersonQuotaHistory   
FROM Sales.SalesPersonQuotaHistory AS spqh  
INNER JOIN Sales.SalesPerson AS sp  
ON spqh.BusinessEntityID = sp.BusinessEntityID  
WHERE sp.SalesYTD > 2500000.00;  
-- No need to mention target table more than once.  
DELETE spqh  
        Sales.SalesPersonQuotaHistory AS spqh  
    INNER JOIN Sales.SalesPerson AS sp  
        ON spqh.BusinessEntityID = sp.BusinessEntityID  
  WHERE  sp.SalesYTD > 2500000.00;  

E.E. TOP を使用して削除する行数を制限するUsing TOP to limit the number of rows deleted

DELETE ステートメントで TOP (n) 句を使用した場合、ランダムに選択される 'n' 行に対して削除操作が実行されます。When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. 次の例では、納期が 2006 年 7 月 1 日より早い 20 行を AdventureWorks2012AdventureWorks2012 データベース内の PurchaseOrderDetail テーブルからランダムに選択して削除します。The following example deletes 20 random rows from the PurchaseOrderDetail table in the AdventureWorks2012AdventureWorks2012 database that have due dates that are earlier than July 1, 2006.

DELETE TOP (20)   
FROM Purchasing.PurchaseOrderDetail  
WHERE DueDate < '20020701';  

TOP を使用して、意味のある順序で行を削除する必要がある場合は、サブセレクト ステートメントで ORDER BY を指定して TOP を使用する必要があります。If you have to use TOP to delete rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement. 次のクエリでは、納期が早いものから 10 行を PurchaseOrderDetail テーブルから削除します。The following query deletes the 10 rows of the PurchaseOrderDetail table that have the earliest due dates. 10 行だけを確実に削除するために、サブセレクト ステートメントではテーブルの主キーの列 (PurchaseOrderID) を指定しています。To ensure that only 10 rows are deleted, the column specified in the subselect statement (PurchaseOrderID) is the primary key of the table. サブセレクト ステートメントで非キー列を指定すると、指定した列に重複する値が含まれる場合、10 行以上の行が削除される可能性があります。Using a nonkey column in the subselect statement may result in the deletion of more than 10 rows if the specified column contains duplicate values.

DELETE FROM Purchasing.PurchaseOrderDetail  
WHERE PurchaseOrderDetailID IN  
   (SELECT TOP 10 PurchaseOrderDetailID   
    FROM Purchasing.PurchaseOrderDetail   
    ORDER BY DueDate ASC);  

リモート テーブルから行を削除するDeleting Rows From a Remote Table

このセクションの例では、リンク サーバーまたは行セット関数を使用してリモート テーブルを参照し、リモート テーブルから行を削除する方法を示します。Examples in this section demonstrate how to delete rows from a remote table by using a linked server or a rowset function to reference the remote table. リモート テーブルとは、別のサーバーまたは別の SQL Server インスタンスにあるテーブルのことです。A remote table exists on a different server or instance of SQL Server.

適用対象: SQL Server 2008SQL Server 2008 以降。Applies to: SQL Server 2008SQL Server 2008 and later.

F.F. リンク サーバーを使用してリモート テーブルからデータを削除するDeleting data from a remote table by using a linked server

次の例では、リモート テーブルの行を削除します。The following example deletes rows from a remote table. sp_addlinkedserver を使用してリモート データ ソースへのリンクを作成した後、The example begins by creating a link to the remote data source by using sp_addlinkedserver. server.catalog.schema.object という形式の、4 つの要素で構成されたオブジェクト名の一部として、リンク サーバー名 MyLinkServer を指定します。The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

USE master;  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
DELETE MyLinkServer.AdventureWorks2012.HumanResources.Department 
WHERE DepartmentID > 16;  

G.G. OPENQUERY 関数を使用してリモート テーブルからデータを削除するDeleting data from a remote table by using the OPENQUERY function

次の例では、 OPENQUERY 行セット関数を指定してリモート テーブルから行を削除します。The following example deletes rows from a remote table by specifying the OPENQUERY rowset function. この例では、前の例で作成したリンク サーバー名を使用します。The linked server name created in the previous example is used in this example.

DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName 
FROM AdventureWorks2012.HumanResources.Department  
WHERE DepartmentID = 18');  

H.H. OPENDATASOURCE 関数を使用してリモート テーブルからデータを削除するDeleting data from a remote table by using the OPENDATASOURCE function

次の例では、OPENDATASOURCE 行セット関数を指定してリモート テーブルから行を削除します。The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. server_name または server_name\instance_name という形式を使用して、データ ソースの有効なサーバー名を指定します。Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

    'Data Source= <server_name>; Integrated Security=SSPI')  
WHERE DepartmentID = 17;'  

DELETE ステートメントの結果をキャプチャするCapturing the results of the DELETE statement

I.I. DELETE を OUTPUT 句と共に使用するUsing DELETE with the OUTPUT clause

次の例では、DELETE ステートメントの結果を AdventureWorks2012AdventureWorks2012 データベース内のテーブル変数に保存する方法を示します。The following example shows how to save the results of a DELETE statement to a table variable in the AdventureWorks2012AdventureWorks2012 database.

DELETE Sales.ShoppingCartItem  
WHERE ShoppingCartID = 20621;  
--Verify the rows in the table matching the WHERE clause have been deleted.  
SELECT COUNT(*) AS [Rows in Table] 
FROM Sales.ShoppingCartItem 
WHERE ShoppingCartID = 20621;  

J.J. OUTPUT を DELETE ステートメント内で <from_table_name> と共に使用するUsing OUTPUT with <from_table_name> in a DELETE statement

次の例は、DELETE ステートメントの FROM 句で定義された検索条件に基づいて、AdventureWorks2012AdventureWorks2012 データベース内の ProductProductPhoto テーブルの行を削除します。The following example deletes rows in the ProductProductPhoto table in the AdventureWorks2012AdventureWorks2012 database based on search criteria defined in the FROM clause of the DELETE statement. OUTPUT 句では、削除されるテーブルの列 ( DELETED.ProductIDDELETED.ProductPhotoID)、および Product テーブルの列を返します。The OUTPUT clause returns columns from the table being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product table. これは FROM 句で削除する行を指定するときに使用されます。This is used in the FROM clause to specify the rows to delete.

DECLARE @MyTableVar table (  
    ProductID int NOT NULL,   
    ProductName nvarchar(50)NOT NULL,  
    ProductModelID int NOT NULL,   
    PhotoID int NOT NULL);  
DELETE Production.ProductProductPhoto  
    INTO @MyTableVar  
FROM Production.ProductProductPhoto AS ph  
JOIN Production.Product as p   
    ON ph.ProductID = p.ProductID   
    WHERE p.ProductModelID BETWEEN 120 and 130;  
--Display the results of the table variable.  
SELECT ProductID, ProductName, ProductModelID, PhotoID   
FROM @MyTableVar  
ORDER BY ProductModelID;  

例: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) および Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

K.K. テーブルからすべての行を削除するDelete all rows from a table

次の例では、削除する行数を制限する WHERE 句が指定されていないため、Table1 テーブルからすべての行が削除されます。The following example deletes all rows from the Table1 table because a WHERE clause is not used to limit the number of rows deleted.


L.L. テーブルから行のセットを削除するDELETE a set of rows from a table

次の例では、StandardCost 列の値が 1000.00 より大きいすべての行を Table1 テーブルから削除します。The following example deletes all rows from the Table1 table that have a value greater than 1000.00 in the StandardCost column.

WHERE StandardCost > 1000.00;  

M.M. DELETE ステートメントで LABEL を使用するUsing LABEL with a DELETE statement

次の例では、DELETE ステートメントでラベルを使用します。The following example uses a label with the DELETE statement.

OPTION ( LABEL = N'label1' );  

N.N. DELETE ステートメントでラベルとクエリ ヒントを使用するUsing a label and a query hint with the DELETE statement

このクエリでは、DELETE ステートメントでクエリ結合ヒントを使用する場合の基本構文を示します。This query shows the basic syntax for using a query join hint with the DELETE statement. 結合ヒントと OPTION 句の使用方法の詳細については、「OPTION 句 (Transact-SQL)」を参照してください。For more information on join hints and how to use the OPTION clause, see OPTION Clause (Transact-SQL).

-- Uses AdventureWorks  
DELETE FROM dbo.FactInternetSales  
WHERE ProductKey IN (   
    SELECT T1.ProductKey FROM dbo.DimProduct T1   
    JOIN dbo.DimProductSubcategory T2  
    ON T1.ProductSubcategoryKey = T2.ProductSubcategoryKey  
    WHERE T2.EnglishProductSubcategoryName = 'Road Bikes' )  
OPTION ( LABEL = N'CustomJoin', HASH JOIN ) ;  

参照See Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
WITH common_table_expression (Transact-SQL) WITH common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)@@ROWCOUNT (Transact-SQL)