Неверный синтаксис рядом с ключевым словом «выбрать» - PullRequest
0 голосов
/ 11 сентября 2010

У меня плохо нормализованный набор таблиц, и я пытаюсь исправить эту проблему.БД - MS SQL 2005.

В Table1 есть поле id (идентификатор записи), поле mainID (идентификатор человека) и поле sequence (и int, определяющий порядок сортировки)

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

Я добавил новое поле в вызов table2table2_id и я хотел бы заполнить это поле идентификатором из table2, чтобы я мог покончить с 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  

Ответы [ 3 ]

3 голосов
/ 11 сентября 2010

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

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

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

0 голосов
/ 11 сентября 2010

Вот один из способов, с помощью вашего оператора SELECT, который работает, и завернуть его в CTE:

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 голосов
/ 11 сентября 2010

Я понял это

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 

Ошибка, по-видимому, была вызвана тем, что у меня был псевдоним в операторе обновления, а не в операторе from.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...