Как обновить запись с помощью mysql join? - PullRequest
2 голосов
/ 02 марта 2012

В моем MySQL есть таблицы t1, t2, и я хочу обновить поле t1 из значения поля t2 на основе значения поля t1, совпадающего со значением поля t2

Я попробовал ниже, но это не обновление. Что я здесь неправильно сделал

UPDATE t1 
INNER JOIN t2 
ON t1.name = t2.name 
SET t1.age = t2.age 
WHERE t1.name IS NOT NULL;

Ответы [ 4 ]

2 голосов
/ 02 марта 2012

Вам необходимо отделить таблицу, которую вы хотите обновить, от таблицы, которую вы запрашиваете, даже если она такая же:

UPDATE t1  
SET t1.age = t2.age
FROM t1 as tempT1
INNER JOIN t2 
ON tempT1.name = t2.name 
WHERE tempT1.name IS NOT NULL;

UPDATE
Очевидно, MySQL использует другой синтаксис UPDATE JOIN, чем другие базы данных. Ваш первоначальный запрос, похоже, использует правильный синтаксис, просто для того, чтобы убедиться, что вы пытаетесь создать псевдоним имен таблиц:

UPDATE t1 temp1
INNER JOIN t2 temp2
ON temp1.name = temp2.name 
SET temp1.age = temp2.age 
WHERE temp1.name IS NOT NULL;

ОБНОВЛЕНИЕ 2
Посмотрев немного дольше, я уверен, что проблема заключается в предложении WHERE:
WHERE temp1.name IS NOT NULL
В любом случае вы не можете объединять нулевые значения, поэтому они отфильтрованы по умолчанию. Предложение WHERE как-то мешает соединению.
Попробуйте и удалите его, чтобы увидеть, работает ли UPDATE. Если вы не хотите выполнять и обновлять сразу, просто выполните выбор с тем же JOIN CLAUSE, чтобы увидеть, какие записи будут затронуты.

Вот общая ссылка на NULL и JOIN:
http://databases.about.com/library/weekly/aa051203a.htm

Вот справочник по SQL Server в соответствии с приведенным выше: http://msdn.microsoft.com/en-us/library/ms190409.aspx

Не удалось найти ссылку на MySQL, в которой это явно указано, но я думаю, что это верно для всех реляционных БД.

1 голос
/ 13 марта 2012

Я сам также нашел другой способ достичь этого же сценария.Я вставляю ответ здесь, чтобы другие могли получить пользу.

UPDATE t1 SET t2_age = (SELECT age FROM t2 BINARY WHERE name = t1.name);
0 голосов
/ 02 марта 2012

Попробуйте это

UPDATE t1,t2  
SET t1.age = t2.age
FROM t1 as tempT1
INNER JOIN t2 ON tempT1.name = t2.name 
WHERE tempT1.name IS NOT NULL;
0 голосов
/ 02 марта 2012

Попробуйте это:

update t1
set t1.age = t2.age
from t1
inner join t2 on t1.name = t2.name
where t1.name is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...