2016-06-02 6 views
2

Ich habe einige Probleme beim Schreiben einer SQL-Update-Funktion. Ich habe eine Tabelle mit Zitaten und eine zweite Tabelle mit Produkten, die diesen Zitaten zugeordnet sind. Ich versuche, alle Status von Anführungszeichen mit bestimmten $ -Werten basierend auf den Produkten festzulegen. Ich kann nicht scheinen, diese Abfrage richtig zu formatieren (Code unten). Ich weiß, dass der Code auf 1 ID begrenzt ist, die derzeit versucht, mit 1 zu testen, bevor ich diesen Teil entferne.sql Update-Funktion mit einem linken Join

sqlStringUpdate = "UPDATE fq SET fq.spQuoteStatus = 5 From factQuote fq (LEFT JOIN FactQuoteProduct as fqp on fq.spQuoteID=fqp.fk_spQuoteID) " & _ 
"WHERE fq.spQuoteID = 4844 and ((sum(fqp.ItemTotal) <2000 and fq.quoteDate < #" & firstset & "#) or (fq.bu=3401 and sum(fqp.ItemTotal) <10000 and fq.quoteDate < #" & secondset & "#) or (fq.bu>3401 and sum(fqp.ItemTotal) <10000 and fq.quoteDate < #" & secondset & "#));" 

Fehlercode: Fehler 3075 (Syntaxfehler (fehlender Operator) in Abfrageausdruck '5 Left factQUotePRoduct als FQP auf fq.spQUoteID = fqp.fk_spQuoteID JOIN)

+1

So tun sollten, was ist der Fehler, Sie bekommen oder die, wie die Ergebnisse passen Sie bekommen nicht, was Sie erwartet? Ich schätze, Sie bekommen einen Fehler, weil das UPDATE ... SET ... FROM inkorrekte Syntax ist. Sie aktualisieren eine Tabelle und legen einen Wert für eine Bedingung fest. Normalerweise lautet dies UPDATE ... SET ... WHERE. – Dresden

+0

der Fehler ist Syntax fehlt Operator –

+0

Ist der Wagenrücklauf in Ihrem tatsächlichen Code? Sie haben das _ _ vergessen, und mit den doppelten Anführungszeichen müssen Sie '&' an den Anfang von Zeile 2 setzen. Wenn nicht, könnte der fehlende Operator ein Semikolon am Ende von Zeile 1 sein, denn das ist alles Sie speichern in 'sqlStringUpdate'. – MoondogsMaDawg

Antwort

0

erstes Problem ist die LEFT JOIN sollte nicht in Klammern sein.

zweites Problem, müssen Sie das Aggregat vor dem Update berechnen, können Sie diese mit CTE-Syntax lösen, versuchen, etwas wie folgt aus:

;with 
fqp as (
    select fk_spQuoteID, sum(ItemTotal) sum_ItemTotal 
    from FactQuoteProduct 
    group by fk_spQuoteID 
) 
UPDATE fq SET fq.spQuoteStatus = 5 
From factQuote fq 
LEFT JOIN fqp on fq.spQuoteID=fqp.fk_spQuoteID 
WHERE fq.spQuoteID = 4844 
and (
    (fqp.sum_ItemTotal <2000 and fq.quoteDate < @firstset) 
    or (fq.bu=3401 and fqp.sum_ItemTotal <10000 and fq.quoteDate < @secondset) 
    or (fq.bu>3401 and fqp.sum_ItemTotal <10000 and fq.quoteDate < @secondset) 
    ); 

, wenn Sie mit CTE nicht üblich sind Syntax können Sie wählen verschachtelt verwenden wie folgt aus:

UPDATE fq SET fq.spQuoteStatus = 5 
From factQuote fq 
LEFT JOIN (
    select fk_spQuoteID, sum(ItemTotal) sum_ItemTotal 
    from FactQuoteProduct 
    group by fk_spQuoteID 
) as fqp on fq.spQuoteID=fqp.fk_spQuoteID 
WHERE fq.spQuoteID = 4844 
and (
    (fqp.sum_ItemTotal <2000 and fq.quoteDate < @firstset) 
    or (fq.bu=3401 and fqp.sum_ItemTotal <10000 and fq.quoteDate < @secondset) 
    or (fq.bu>3401 and fqp.sum_ItemTotal <10000 and fq.quoteDate < @secondset) 
    ); 

dies den Trick

Verwandte Themen