2017-05-09 6 views
-4

これはテストスタディガイドからのものです。このクエリの目的は何ですか?この印刷機能はwhileループの一部ですか、またはwhileループの後にのみ実行されますか?このクエリは何をしますか?

1,000から200,000ドルの請求書を削除するのはこの目的ですか?

whileループはすべて実際にループしますか?ループは破損します。合計は200,000を超えています。請求書の合計が1,000未満の場合、ループは破損します。合計が1,000〜200,000の間であれば、終了しますか?

USE AP 

SELECT * INTO #InvoiceCopy FROM Invoices 

DECLARE @InvoiceID int, @InvoiceTotal money 
DECLARE @Total money 
SET @Total = 0 

WHILE @Total + (SELECT TOP 1 InvoiceTotal 
       FROM #InvoiceCopy 
       ORDER BY InvoiceTotal DESC) <= 200000 
BEGIN 
    SELECT TOP 1 @InvoiceID = InvoiceID, @InvoiceTotal = InvoiceTotal 
    FROM  #InvoiceCopy 
    ORDER BY InvoiceTotal DESC 

    IF @InvoiceTotal < 1000 
     BREAK 
    ELSE 
    BEGIN 
     SET @Total = @Total + @InvoiceTotal 

     DELETE FROM #InvoiceCopy 
     WHERE InvoiceID = @InvoiceID 
    END 
END 
PRINT 'Total: $' + CONVERT(varchar, @Total, 1) 
+3

良い悲しみは何のための学習ガイドですか?これは、この恐ろしいRBAR(行を苦労させる行)タイプのロジックの代わりに、セットベースのロジックを使用する理由の優れた例です。そして、それは非常に脆いです。これは、考案された値を超えない限り、無限ループに終わる可能性があります。あなたの教授は実際に人々を教える前にデータベースを学ぶべきです。 –

+0

LOL ...どうして本当に感じますか?うん、私は同意する。さらに悪いことに、この特別なケースでは自分のことを教えることに相当するオンラインクラスです。それは雑用です。スタックオーバーフローのために神に感謝します。 –

+0

私はあなたの痛みを感じます。余りにも多くの場合、教授はあまりにも多くの場合、彼らは学生や将来の雇用主にとって、新入生に教えられた古風な考え方を解き放つように苦痛を与えます。あなたが取り組んでいるものは、本質的には実行中の合計に相当します。 SQL Serverのバージョンによっては、whileループを使用するよりも優れた解決策があります。 –

答えて

0

(私が言うことができるものから)クエリの目的は$ 1000を下のいずれかの請求書がない限り、$ 200Kの下にあるすべての請求書をまとめると、合計を表示することです。私は、あなたは、単にそのテーブルの負荷を軽減しようとしている場合を除き、あなたは、このために一時テーブルとループを使用する理由見当もつかない - でも、その後、このクエリはまったく同じことをするだろう:

USE AP 

DECLARE @Total money 

SELECT * INTO #InvoiceCopy FROM Invoices 

SELECT @Total = SUM(InvoiceTotal) 
FROM #InvoiceCopy 
WHERE InvoiceTotal <= 200000 

PRINT 'Total: $' + CONVERT(varchar, @Total, 1) 

奇妙InvoiceTotalが$ 1000未満の場合、BREAKとなります。それらをフィルタリングするだけで済みます。つまり、 "不良データ"(ループを壊すと思う唯一の理由)を表すため、これらをチェックする必要がある場合は、ループを開始する前にこのチェックを行う必要があります。

IF EXISTS (SELECT 1 FROM #InvoiceCopy WHERE InvoiceTotal < 1000) 
    RAISERROR('Invoices under $1000 exist.', 16, 1) 

基本的に、上記のコメントでSeanが言ったことは100%正確です。これを行うにはもっと良い方法があります。

関連する問題