2017-05-05 9 views
0
SELECT DISTINCT Panel_ID,Delivery_Date 
FROM SalesFact_Final_History_bk_04MAY a 
WHERE (SELECT COUNT(DISTINCT(delivery_date)) 
     FROM SalesFact_Final_History_bk_04MAY b 
     WHERE a.Delivery_Date<=b.Delivery_Date 
     AND a.Panel_ID=b.Panel_ID 
) < 3 
ORDER BY Panel_ID,Delivery_Date DESC 

ここで私は、履歴テーブルから各パネルIDの最新の二つの日付を選択しています。 この情報を削除せずにすべての情報を削除します。 どうすればいいですか?SQLサーバーで選択されたステートメントなしのテーブルからすべてのレコードを削除する方法は?

+0

私はこれを完了するために、カーソルを使用することはできますか? もし私はあなたがどのようにイドを提案することができますか? –

+0

実際にどのテーブルからレコードを削除しますか? –

+0

SalesFact_Final_History_bk_04MAY –

答えて

0

次のことを試してみてください...

DELETE SalesFact_Final_History_bk_04MAY 
FROM SalesFact_Final_History_bk_04MAY 
INNER JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY Panel_ID ORDER BY Delivery_Date DESC) AS recordNumber, 
        Panel_ID AS Panel_ID, 
        Delivery_Date AS Delivery_Date 
      FROM (SELECT Panel_ID AS Panel_ID, 
          Delivery_Date AS Delivery_Date 
        FROM SalesFact_Final_History_bk_04MAY 
        GROUP BY Panel_ID, 
          Delivery_Date 
       ) AS uniquePanel_IDDelivery_Date 
      ) AS recordsToKeepFinder ON SalesFact_Final_History_bk_04MAY.Panel_ID <> recordsToKeepFinder.Panel_ID 
            AND SalesFact_Final_History_bk_04MAY.Delivery_Date <> recordsToKeepFinder.Delivery_Date 
            AND recordNumber > 2; 

この文では、あなたの付属書(ここでは有用ではありませんサンセリフ発注、)によって生成されたリストを受け取り、そして、そのような方法でSalesFact_Final_History_bk_04MAYINNER JOINを行い、 SalesFact_Final_History_bk_04MAYのレコードがではなく、という一致を持つと、SELECTステートメントの結果に一致し、が一致するレコードはすべてとなります。 SELECTステートメントで保持されているすべてのレコードは、SalesFact_Final_History_bk_04MAYから削除されます。

ご不明な点がございましたら、お気軽にコメントを投稿してください。ここで

+0

私はこれに対してエラーを受けました。 –

+0

エラーメッセージの全文など、エラーの詳細を教えてください。 – toonice

+0

は、私は私の答えを更新しました –

0

のソリューションです:あなたはこれを試してみてくださいすることができ:

DELETE a 
FROM SalesFact_Final_History_bk_04MAY a 
WHERE (SELECT COUNT(DISTINCT(delivery_date)) 
     FROM SalesFact_Final_History_bk_04MAY b 
     WHERE a.Delivery_Date<=b.Delivery_Date 
     AND a.Panel_ID=b.Panel_ID 
) >= 3 
+0

Thanx manこれは私のために働きます:) –

-1
Try this code 

DELETE FROM SalesFact_Final_History_bk_04MAY WHERE Panel_ID NOT IN (
SELECT DISTINCT Panel_ID 
FROM SalesFact_Final_History_bk_04MAY a 
WHERE (SELECT COUNT(DISTINCT(delivery_date)) 
FROM SalesFact_Final_History_bk_04MAY b 
WHERE a.Delivery_Date<=b.Delivery_Date 
AND a.Panel_ID=b.Panel_ID 
) < 3 
ORDER BY PANEL_ID,DELIVERY_DATE DESC 
) 
+0

最初の 'WHERE'節で' Panel_ID'と比較されるリストは2つではなく1つのフィールドを返す必要があります。 'SQL-Server'はどのフィールドが比較の対象であるかを安全に判断できません。また、インデントを使用して、コードが属するステートメントのレベルを特定してください。 – toonice

+0

申し訳ありませんが私の間違い私はとにかく感謝しなかった –

関連する問題