2012-08-28 4 views
1
Timezones 
--------- 
-AreaCode varchar 
-Timezone varchar 

Contacts 
-------- 
-Phone varchar 
-Timezone varchar 

Все заполняемая кроме Timezone в таблице контактов, так что я хочу для поиска временной зоны для каждого номера телефона и обновлять контакты. Вот что я пытался сделать, но MySQL даетSQL Update, подзапрос возвращает более одной строки

Ошибка 1242 подзапрос возвращает более одной строки

Для каждой временной зоны (0, -1, -2, -3, -4, -5), я исполню это обновление:

update contacts 
set contacts.timezone = '-1' 
where left(contacts.phone,3) = (Select timezones.areacode 
           from timezones 
           where timezones.timezone = '-1'); 
+2

Ну, вы подтвердили, что на самом деле * есть * только один часовой пояс для каждого ID? –

+0

Я только что проверил, в таблице часовых поясов нет повторяющихся арекодов – user1630799

+0

Я спросил о повторяющихся значениях часового пояса, а не о дублировании isacodes. –

ответ

2

Y наш подзапрос возвращает более одной строки. Просто замените «=» на «IN», чтобы справиться с этой проблемой:

update contacts 
set contacts.timezone = '-1' 
where left(contacts.phone,3) in (Select timezones.areacode 
           from timezones 
           where timezones.timezone = '-1'); 
+0

Удивительный! спасибо – user1630799

0

Try внутреннее соединение по обновлению или подзапрос:

update contacts 
set contacts.timezone = '-1' 
where left(contacts.phone,3) in (Select timezones.areacode 
           from timezones 
           where timezones.timezone = '-1'); 
0

Изменить где часть, как: ....

where left(...) in (select ......) 
0

Проблема в том, что, вероятно, есть более чем один ряд в часовых поясов, имеющих т imezone column = '-1'

Вы можете использовать Join здесь

update contacts join timezones on left(contacts.phone,3) = timezones.areacode and timezones.timezone = '-1' 
set contacts.timezone = '-1'; 

Он будет соответствовать асакодам с телефонами, и в этом случае будет обновлен с '-1'

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