Как связать подзапрос с внешним запросом на обновление

0

Здравствуйте, у меня есть база данных, которая выглядит примерно так.

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'
  • 0
    Я еще не запускал его, но запустил только часть в скобках, поэтому я боюсь, что проблема (ВЫБЕРИТЕ номер телефона, ГДЕ имя LIKE '% _Cell') возвращает Jane_Doe_Cell и John_Doe_Cell, поэтому он не будет правильно устанавливать Jane_Doe_Cell или John_Doe_Cell
  • 0
    У вас возникла эта проблема, потому что вам действительно нужно разделить столбцы для 1 для домашнего телефона и 1 для мобильного телефона. тогда это будет простое обновление.
Теги:

1 ответ

0

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

  1. Суб-выбор возвращает более одного результата для обновления и

  2. результат подвыборки не связан с набором 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 как упражнение для читателя).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню