Здравствуйте, у меня есть база данных, которая выглядит примерно так.
uniqueid description name phonenumber
66370 SALES John_Doe_Cell 555-5555
87296 SALES John_Doe_Home 555-4444
66786 ACCOUNTING Jane_Doe_Cell 555-3333
67897 ACCOUNTING Jane_Doe_Home 555-2222
Я пытаюсь выполнить запрос, который будет тянуть phonenumber
для %_Cell
и передать, что телефонный номер, %_Home
. Так, например, в приведенной выше таблице мне нужно, чтобы phonenumber John_Doe_Cell был помещен в номер телефона John_Doe_Home, то же самое касается Jane_Doe_Cell и Jane_Doe_Home.
Очередь, которую я имею до сих пор, следующая, но я не чувствую, что она будет работать. Мне нужно иметь возможность передать имя, которое оно находит во время поиска, которое будет применено к %_Home
чтобы оно %_Home
правильное имя с помощью номера телефона.
UPDATE 'some_table' SET phonenumber=(SELECT phonenumber WHERE 'name' LIKE '%_Cell')
WHERE queue_name LIKE '%_Home'
Ваша схема, по меньшей мере, нечетна и может быть нормализована, но чтобы ответить на ваш вопрос по вашему запросу, ваша проблема в два раза.
Суб-выбор возвращает более одного результата для обновления и
результат подвыборки не связан с набором UPDATE.
Из ваших данных, попробуйте выполнить подзаголовок:
> SELECT phonenumber WHERE 'name' LIKE '%_Cell';
+-------------+
| phonenumber |
+-------------+
| 555-5555 |
| 555-3333 |
+-------------+
Затем, чтобы обновить, вам нужно как получить свой подзаголовок, чтобы вернуть 1 строку, и вы захотите связать ее с внешним набором строк запроса. Например, это сработает, чтобы дать вам одну строку для подзаголовка, но даст вам неправильные данные:
> UPDATE 'some_table' AS upd SET phonenumber = (
SELECT phonenumber
FROM 'some_table' AS inn
WHERE
'name' LIKE '%_Cell'
LIMIT 1
)
WHERE queue_name LIKE '%_Home';
В какой строке будет отображаться внутренний запрос для каждой внешней строки? (Подсказка: попробуйте и посмотрите, возможно, в транзакции, чтобы вы могли откатить результаты.) Чтобы подключить внутренний и внешний запрос, я предполагаю, что это то, что вы можете захотеть:
> UPDATE 'some_table' AS upd SET phonenumber = (
SELECT phonenumber
FROM 'some_table' AS inn
WHERE
'name' LIKE '%_Cell'
AND inn.description = upd.description
)
WHERE queue_name LIKE '%_Home';
Обратите внимание, что inn.description = upd.description
, который, учитывая предоставленные вопросы, является единственной частью данных, которая уникально связывает inn.description = upd.description
строки.
В целом (с определенными исключениями) объединение текстовых столбцов и других неиндексированных полей указывает на плохой дизайн схемы. Если это для серьезного проекта, я настоятельно рекомендую вам изучить нормализацию схемы по крайней мере до 3- й нормальной формы. (Я оставлю googling как упражнение для читателя).