2012-03-25 3 views
0

У меня возникли проблемы с реализацией этого запроса в vb.net. Сообщение об ошибке, которое я получаю, имеет «как» в первой строке. Это локальный SQL Сжатие базы данных 3,5Ошибка синтаксиса в SQL-запросе

 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() 

Сообщение об ошибке - 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() 

Сообщение об ошибке - http://i40.tinypic.com/106kn86.png

+0

У меня возникли проблемы синтаксического анализа SQL ... что вы пытаетесь делать с этим вопросом? ОБНОВЛЕНИЕ: теперь я вижу, что вы пытаетесь сделать всех стартерами, чем тот, кто не имеет более квалифицированного игрока того же веса в той же школе. – McGarnagle

+0

Связанный вопрос (но не дубликат): [Как улучшить скорость этого SQL обновить запрос?] (http://stackoverflow.com/questions/9847599/how-to-improve-the-speed-of-this-sql-update-query). –

+0

Почему бы вам не использовать хранимую процедуру? – PraveenVenu

ответ

1

ли эта работа?

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 добавить:

Это вероятно, будет работать быстрее, если вы создаете индекс:

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

ДА !, это, кажется, работает. Однако это довольно медленно. Если бы я сделал это хранимой процедурой, это было бы намного быстрее, чем вы думаете? – Meowbits

+0

Нет, написание его как хранимой процедуры НЕ сделало бы это МНОГО быстрее. Единственное ускорение будет дано, потому что запрос будет скомпилирован заранее и не понадобится перекомпилировать его при каждом прогоне. Способ Диего может быть быстрее, если вы его запустите :) В противном случае вам нужно будет проверить свои индексы. –

+0

Это правильный ответ. SQL Server Compact ОЧЕНЬ отличается от SQL Server и не поддерживает 'left external join' или псевдонимы таблиц. – Diego

0

Я считаю, что вы хотите:

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

Я получаю сообщение об ошибке с этим, также как и выше, ошибка в «FROM»:/ – Meowbits

+0

Была небольшая опечатка (отсутствующая закрывающая скобка). Теперь он исправлен. – Leigh

+0

SQL Server Compact ОЧЕНЬ отличается от SQL Server и не поддерживает 'left external join' или псевдонимы таблицы. – Diego

Смежные вопросы