2010-09-10 4 views
0

У меня плохо нормированный набор таблиц, и я пытаюсь исправить эту проблему. БД MS SQL 2005.Неверный синтаксис рядом с ключевым словом «select»

Таблица1 имеет id поле (идентификатор записи), A mainID поле (лицо ID) и поле (sequence и Int, который определяет порядок сортировки)

Table2 имеет свой собственный id поле и копия идентификатора для первой записи лицом (sequence = 1).

Я добавил новое поле в table2 call table2_id, и я хотел бы заполнить это поле идентификатором из таблицы2, чтобы я мог покончить с table1.mainID. table2 имеет только запись для одной из записей для каждого человека, а mainId - идентификатор, где table1.sequence = 1.

Это запрос на обновлении, я думал, что буду делать работу, я получаю ошибку

update table1 as a 
set regInfoID = (select b.id 
       from table2 as b 
       where b.ref1 = (select c.id 
           from table1 as c 
           where c.mainID = a.mainID 
             and sequence = 1)) 

Я считаю, что я на правильном пути, так как ее следующий запрос отлично работает

select regInfoID = (select b.id 
        from table2 as b 
        where b.ref1 = (select c.id 
            from table1 as c 
            where c.mainID = a.mainID 
              and sequence = 1)), a.* 
from table1 as a 
+0

Какое сообщение об ошибке? –

+0

MS SQL 2005 и сообщение об ошибке: «Msg 156, Level 15, State 1, Line 2 Неверный синтаксис рядом с ключевым словом« select ».» –

ответ

3

Я думаю, что ваш запрос эквивалентен следующему:

update a 
set regInfoID = b.id 
-- select a.*, b.id 
from table2 b 
inner join table1 c on c.id = b.ref1 
inner join table1 a on c.mainID = a.mainID and c.sequence = 1 

Из этого запроса, я думаю, вы potentiall y имеют неопределенные результаты, поскольку таблица2 (b) не гарантируется как результат одной строки. Поэтому regInfoID будет установлен в одно из полученных значений b.id.

+0

Я никогда не думал о написании запроса на обновление, используя этот стиль раньше. Я проверил, что таблица2 действительно была одна для многих, прежде чем я начал работать над обновлением. Спасибо за вашу помощь. –

+0

Отлично, без проблем. Эта форма работает хорошо, потому что я могу сначала написать инструкцию select, чтобы увидеть, как будут выглядеть результаты, а затем просто замените SELECT на UPDATE. –

0

Я понял это

update table1 
set regInfoID = (select b.id 
       from table2 as b 
       where b.ref1 = (select c.id 
           from table1 as c 
           where c.mainID = a.mainID 
             and sequence = 1)) 
from table1 as a 

кажется ошибка, была причина по моему имея в частности модификации, а не в из заявления.

Спасибо за помощь.

+0

yup, вот и все. если вам нужен псевдоним, вам нужно использовать предложение 'FROM'. Это стандарт не ANSI, кстати. FWIW, также см. Мой пример с использованием CTE. эта форма держит меня в здравом уме. –

0

Вот один из способов, с помощью ЗЕЬЕСТ, который работает, и окружив его в КТР:

with cte as (
    select a.*, _regInfoID = (select b.id 
         from table2 as b 
         where b.ref1 = (select c.id 
             from table1 as c 
             where c.mainID = a.mainID 
               and sequence = 1)) 
    from table1 as a 
    ) 
update cte set regInfoID = _regInfoID 

Мне нравится этот стиль, так как вы можете просмотреть ваши изменения перед их применением, и это тривиально, чтобы превратить SELECT в UPDATE

Но проблема, с которой вы столкнулись с исходным запросом, была просто синтаксической ошибкой. Вот как это должно было быть написано. Примечание FROM table1 AS a:

update a 
set regInfoID = (select b.id 
       from table2 as b 
       where b.ref1 = (select c.id 
           from table1 as c 
           where c.mainID = a.mainID 
             and sequence = 1)) 
from table1 as a 
+0

Спасибо, Питер.Да, это было так же просто, как добавить псевдоним к выражению from. Это, в конечном счете, я выяснил, была проблема. Я собираюсь дать это Джеффу Meatball Yang, так как он избил вас на 7 минут, и я думаю, что его переработка запроса стала более жесткой, чем моя оригинальная. –

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