Актуализация на SQL, подзаявката връща повече от един ред

Timezones
---------
-AreaCode varchar
-Timezone varchar

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

Всичко е попълнено с изключение на Timezone в таблицата с контакти, така че искам да потърся часовата зона за всеки телефонен номер и да актуализирам контактите. Ето какво се опитах да направя, но MySQL дава

Грешка 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');

person user1630799    schedule 28.08.2012    source източник
comment
Е, потвърдихте ли, че наистина има само една часова зона за всеки ID?   -  person Jon Skeet    schedule 28.08.2012
comment
Току-що проверих, няма дублиращи се регионални кодове в таблицата с часови зони   -  person user1630799    schedule 28.08.2012
comment
Попитах за дублиращи се timezone стойности, а не за дублиращи се регионални кодове.   -  person Jon Skeet    schedule 28.08.2012


Отговори (4)


Вашата подзаявка връща повече от един ред. Просто заменете "=" с "IN", за да се справите с този проблем:

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

Опитайте вътрешно присъединяване към актуализацията или подзаявка:

update contacts 
set contacts.timezone = '-1' 
where left(contacts.phone,3) in (Select timezones.areacode 
                                from timezones 
                                where timezones.timezone = '-1');
person D. Lambert    schedule 28.08.2012

Проблемът е, че вероятно има повече от 1 ред в часови зони, които имат timezone column = '-1'

Можете да използвате Join тук

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

Той ще съпостави регионалните кодове с телефоните и в тези случаи ще се актуализира с '-1'

person Gonzalo.-    schedule 28.08.2012

Променете къде част като: ....

where left(...) in (select ...... ) 
person Amy A    schedule 28.08.2012