2012-03-25 18 views
0

Ich habe Probleme beim Implementieren dieser Abfrage in vb.net. Die Fehlermeldung, die ich bekomme, ist mit dem "as" in der ersten Zeile. Dies ist eine lokale SQL Compact Datenbank 3,5Syntaxfehler in der SQL-Abfrage

 cmd.CommandText = "UPDATE player as a " & 
          "SET starter = 'TRUE' " & 
          "WHERE NOT EXISTS (SELECT '1' " & 
          "FROM player AS b " & 
          "WHERE(b.school = a.school) " & 
          "AND b.weight = a.weight " & 
          "AND b.skill > a.skill)" 
     cmd.ExecuteNonQuery() 

Fehlermeldung - http://i40.tinypic.com/34gms5z.png

 cmd.CommandText = "UPDATE a " & 
       "SET starter = 'TRUE' " & 
       "FROM player a " & 
       "LEFT JOIN player b " & 
       "ON a.school = b.school " & 
       "AND a.weight = b.weight " & 
       "AND b.skill > a.skill " & 
       "WHERE b.school is NULL" 
     cmd.ExecuteNonQuery() 

Fehlermeldung - http://i40.tinypic.com/106kn86.png

+0

Ich habe Probleme bei der SQL-Parsing ..., was Sie versuchen zu mit dieser Abfrage tun? UPDATE: Ich sehe jetzt, du versuchst, jeden zu einem Starter zu machen, als wen es nicht mehr fähige Spieler des gleichen Gewichts an der gleichen Schule gibt. – McGarnagle

+0

Verwandte Frage (aber kein Duplikat): [Wie man die Geschwindigkeit dieses SQL verbessert Abfrage aktualisieren?] (http://stackoverflow.com/questions/9847599/how-to-improve-the-speed-of-this-sql-update-query). –

+0

Warum nicht eine gespeicherte Prozedur verwenden? – PraveenVenu

Antwort

1

Does diese Arbeit?

UPDATE player 
SET starter = 'TRUE' 
WHERE NOT EXISTS 
(
    SELECT * FROM player b 
    WHERE b.school = player.school 
    AND b.weight = player.weight 
    AND b.skill > player.skill 
) 

Edited hinzufügen:

Dies ist wahrscheinlich schneller laufen, wenn Sie einen Index erstellen:

CREATE INDEX player_school_weight ON player (school, weight, skill) 
+0

JA !, das scheint zu funktionieren. Es ist jedoch ziemlich langsam. Wenn ich es zu einer gespeicherten Prozedur machen würde, wäre es viel schneller, denkst du? – Meowbits

+0

Nein, das Schreiben als gespeicherte Prozedur würde es NICHT viel schneller machen. Die einzige Geschwindigkeitsüberschreitung wäre gegeben, weil die Abfrage vorher kompiliert würde und nicht benötigt wird, um sie bei jedem Lauf neu zu kompilieren. Diego's Weg ist vielleicht schneller, wenn du es zum Laufen bringst :) Ansonsten müsstest du deine Indizes überprüfen. –

+0

Dies ist die richtige Antwort. SQL Server Compact unterscheidet sich SEHR von SQL Server und unterstützt keine "linken äußeren Joins" oder Tabellenaliase. – Diego

0

Ich glaube, dass Sie dies wünschen:

UPDATE pl 
SET 
    starter = 'True' 
FROM 
    [Player] pl 
LEFT JOIN 
    [Player] pl2 ON (pl.[School] = pl2.[School]) 
    AND 
    (pl.[Weight] = pl2.[Weight]) 
    AND 
    (pl2.[Skill] > pl.[Skill]) 
WHERE pl2.[School] IS NULL 
+0

Ich bekomme auch hier einen Fehler, wie oben, Fehler bei "VON":/ – Meowbits

+0

Es gab einen kleinen Tippfehler (fehlende Klammer). Es ist jetzt behoben. – Leigh

+0

SQL Server Compact unterscheidet sich sehr von SQL Server und unterstützt keine "linken äußeren Joins" oder Tabellenaliase. – Diego