2010-06-15 1 views
2

Я использую MySQL DB, и я хотел бы обновить поле в таблице на основе другого. Что-то вроде:Обновление поля благодаря подзапросу, основанному на другом поле

UPDATE table1 
SET field1 = table2.id 
WHERE field2 IN (
    SELECT table2.name 
    FROM table2 
    ); 

Я знаю, что этот запрос не сработает, но вот идея. Это возможно?

ответ

3

Вы можете использовать коррелированный подзапрос, как показано ниже. Это предполагает, что будет возвращено ровно одно совпадающее значение. Это вызовет ошибку, если возвращается более одного подходящего значения или задано поле null, если возвращается ноль. Если это последнее поведение нежелательно, вам понадобится статья where.

UPDATE table1 
SET field1 = (SELECT DISTINCT table2.ValueColumn 
       FROM table2 
       WHERE table2.JoinColumn = table1.JoinColumn) 

Редактировать

Для просмотра записей с 0 или более 1 матчей вы можете использовать

SELECT table1.JoinColumn, COUNT(DISTINCT table2.ValueColumn) 
FROM table1 
LEFT JOIN table2 
ON table2.JoinColumn = table1.JoinColumn 
GROUP BY table1.JoinColumn 
HAVING COUNT(DISTINCT table2.ValueColumn) <> 1 
+0

Да Вы правы, спасибо. Я не думал об этой возможности. – Nicolas

+0

@Nicolas Для этого также существует синтаксис JOIN. Есть в SQL Server, но я не уверен, что это то же самое в MySQL. –

+0

@Martin. Я в настоящее время тестирую его, и я не могу избавиться от этой ошибки: 'Subquery возвращает более 1 строки', несмотря на попытку добавления DISTINCT в подзапрос. – Nicolas