2016-11-11 9 views
0

他のすべての行を削除できますが、最も古い日付を持つことはできますか?最近の日付を使用して他のものを削除するSQL

など。

Person 

ID   Name   Birthdate 

1   A   20160101 
2   B   20160202 
3   C   20160303 

OLDEST誕生日にくれた人の行のIDを返し、すべての誕生日が同じ日付の場合は最も低いID

で私が行

returns 3 and deletes all other rows 

返却され、他のすべての行を削除する任意のクエリがあります

おかげ

エイデン

+2

1つのクエリでは、* data *と* delete rows *の両方を返すことはできません。あなたは本当に何をしたいですか? –

+0

カーソルがありますか? – Aiden

+0

カーソルでこれを行うことはできますか?すべての記録について、それは上記の規則をしていますか? – Aiden

答えて

0

確かに、DELETE YましたかOUデータベースからレコードを削除し、RETURNであなたが行を選択する意味、あなたは2つの問合せのバッチを使用することができるならば、あなたができることを意味:

DELETE Person 
WHERE ID <> (
    SELECT TOP 1 ID 
    FROM Person 
    ORDER BY Birthdate DESC, ID 
); 

SELECT TOP 1 ID 
FROM Person; 

こと、場合は、id ASCのgaranteesの最後のサブクエリを注文等しい生年月日があり、最低のIDのみが返されます。
最後のSELECTは、残りのPersonだけを返します。

両方の操作に対して1つのクエリだけが必要な場合は、それは可能ではないと私は考えています。

1

ROW_NUMBERを使用すると、Birthdateが結びついている可能性があるため、より正確に必要なレコードを識別するのに役立ちます。そのため、探している行を識別するCommon Table Expression(CTE)を作成します。行番号は1だから、

DECLARE @Table AS TABLE (ID INT, Name CHAR(1), Birthdate DATE) 
INSERT INTO @Table VALUES 
(1,'A','2016/01/01') 
,(2,'B','2016/02/02') 
,(3,'C','2016/03/03') 
,(4,'D','2016/01/01') --note this is a tie for oldest birthdate 

;WITH cte AS (
SELECT 
    * 
    ,ROW_NUMBER() OVER (ORDER BY Birthdate, Id) as RowNumber 
FROM 
    @Table 
) 

です次に、あなたが実際にCTEから削除し、データベースからレコードを削除したいのですが、あなただけ戻っていない(可能性が高い)のデータを変更したい場合は場合は、単に選択しますあなたが本当に変更/データをdelteしたい場合は、上記のコードの後に​​以下の権利をするでしょう:

DELETE FROM cte WHERE RowNumber > 1 

SELECT * FROM @Table 

あなたが本当に自分の条件に一致する1行をしたい場合は、単に上記のCTEの後にこの文を入れてしまうでしょう。

SELECT * FROM cte WHERE RowNumber = 1 
関連する問題