2017-05-09 4 views
-4

Dies ist aus einer Teststudie Leitfaden. Was ist der Zweck dieser Abfrage? Ist diese Druckfunktion ein Teil der while-Schleife oder läuft sie nur nach der while-Schleife?Was macht diese Abfrage?

Ist das der Zweck, Rechnungen zwischen 1.000 und 200.000 Dollar zu löschen?

Wird die while-Schleife jede tatsächliche Schleife durchlaufen? Die Schleife wird brechen, wenn die Gesamtsumme über 200.000 ist .... die Schleife wird brechen, wenn die Rechnungssumme unter 1.000 ist .... wird es auch enden, wenn die Summe zwischen 1.000 und 200.000 korrekt ist?

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

Gute Trauer ein Studienführer für was ??? Dies ist ein hervorragendes Beispiel dafür, warum wir statt dieser schrecklichen RBAR (Reihe nach quälender Reihe) Art von Logik satzbasierte Logik verwenden wollen. Und es ist extrem brüchig. Es könnte in einer Endlosschleife enden, wenn der konstruierte Wert nicht überschritten wird. Ihr Professor sollte wirklich Datenbanken lernen, bevor sie versuchen, Menschen zu unterrichten. –

+0

Lol ... wie fühlst du dich wirklich? Ja ich stimme zu. Um das Ganze noch schlimmer zu machen, ist es ein Online-Kurs, der sich in diesem speziellen Fall ziemlich gut selbst beibringt. Es ist eine lästige Pflicht. Gott sei Dank für den Stapelüberlauf. –

+0

Ich fühle deinen Schmerz. Viel zu oft lehren Professoren schlechte Methoden mit erzwungenen Beispielen. Es verursacht Schmerz für ihre Studenten und ihre zukünftigen Arbeitgeber, um die archaischen Denkweisen beizubringen, die neuen Studenten beigebracht werden. Woran Sie gerade arbeiten, entspricht im Wesentlichen einer laufenden Summe. Abhängig von der Version von SQL Server gibt es bessere Lösungen als eine While-Schleife. –

Antwort

0

Der Zweck der Abfrage (von dem, was ich sagen kann) ist es, alle Rechnungen zu summieren, die die Gesamt unter $ 200K und angezeigt sind, es sei denn, es Rechnungen unter $ 1000 sind. Ich habe keine Ahnung, warum Sie eine temporäre Tabelle und Schleife für diese verwenden würden, es sei denn Sie einfach ist versuchen, Last auf der Tabelle zu reduzieren - auch dann, diese Abfrage tun würde genau das gleiche:

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) 

Die seltsame Teil ist der BREAK wenn der InvoiceTotal unter $ 1000 ist. Sie sollten nur diese herausfiltern - oder wenn es notwendig ist, diese zu überprüfen, weil sie "schlechte Daten" darstellen (der einzige Grund, warum ich daran denke, die Schleife zu unterbrechen), sollten Sie diese Überprüfung vor dem Beginn der Schleife durchführen:

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

Grundsätzlich, was Sean in den Kommentaren oben gesagt hat, ist 100% genau - es gibt so viel bessere Möglichkeiten, dies zu tun.