UPDATE временная таблица с использованием подзапроса и объединенной таблицы завершается неудачно - PullRequest
0 голосов
/ 26 мая 2011

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

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

Моя временная таблица создается следующим образом:

CREATE TEMPORARY TABLE appraisal_lines_submitted (
    current_perceived_state INT(2),
    current_actual_state INT(2),
    current_desired_state INT(2),
    agreed_action_points TEXT,
    agreed_actions_target_date DATE,
    assessor_notes TEXT,
    category_id INT(2),
    sub_categories_id INT(2),
    sub_categories_description VARCHAR(45),
    sequence_number INT(3) PRIMARY KEY,
    first_perceived_state INT(2),
    first_actual_state INT(2),
    first_desired_state INT(2)
);

Затем я запускаю оператор вставки и выбора следующим образом, чтобы поместить данные из текущей оценки во временную таблицу:

INSERT INTO appraisal_lines_submitted (
    current_perceived_state,
    current_actual_state,
    current_desired_state,
    agreed_action_points,
    agreed_actions_target_date,
    assessor_notes,
    category_id,
    sub_categories_id,
    sub_categories_description,
    sequence_number)
SELECT appraisal_lines.perceived_state,
    appraisal_lines.actual_state,
    appraisal_lines.desired_state,
    appraisal_lines.agreed_action_points,
    DATE_FORMAT (appraisal_lines.agreed_actions_target_date, '%d/%m/%Y') AS agreed_actions_target_date_formatted,
    appraisal_lines.assessor_notes,
    appraisal_lines.assessment_category_id,
    assessment_sub_categories.id,
    assessment_sub_categories.description,
    assessment_sub_categories.sequence_number
FROM appraisal_lines LEFT JOIN assessment_sub_categories
    ON appraisal_lines.assessment_sub_category_id = assessment_sub_categories.id
WHERE hyperlink_token ='db678f8595edcd78d8ea7f055f7ee790b804c91e'
    AND assessment_category_id ='5'
ORDER BY sequence_number;

Это работает нормально.

Однако, когда я запускаю приведенную ниже инструкцию по обновлению, происходит сбой

UPDATE appraisal_lines_submitted JOIN
    (SELECT appraisal_lines.perceived_state as update_perceived_state
     FROM appraisal_lines
     WHERE hyperlink_token ='d7cc7e1adc116e0dac31cbad34cd9a2b322c3507'
        AND assessment_category_id ='5'
     ORDER BY appraisal_lines.assessment_sub_category_id
    ) AS increments 
    ON increments.update_perceived_state = appraisal_lines.perceived_state
    SET appraisal_lines_submitted.first_perceived_state = update_perceived_state;

с ошибкой

Код ошибки: 1054
Неизвестный столбец 'appraisal_lines.perceived_state' в 'предложении'

Я написал оператор обновления на основе сообщения: MySQL Обновить значение поля с помощью подзапроса с несколькими возвращающимися строками

Ответы [ 2 ]

2 голосов
/ 26 мая 2011

Вот ваш скрипт, некоторые биты которого выделены жирным шрифтом:

UPDATE <b>appraisal_lines_submitted</b> JOIN
    (SELECT appraisal_lines.perceived_state as update_perceived_state
     FROM appraisal_lines
     WHERE hyperlink_token ='d7cc7e1adc116e0dac31cbad34cd9a2b322c3507'
        AND assessment_category_id ='5'
     ORDER BY appraisal_lines.assessment_sub_category_id
    ) AS <b>increments</b> 
    ON <b>increments</b>.update_perceived_state = <b><i>appraisal_lines</i></b>.perceived_state
    SET appraisal_lines_submitted.first_perceived_state = update_perceived_state;

Теперь в вашем скрипте вы соединяете таблицу с именем appraisal_lines_submitted с (производной) таблицей с именем increments.Условие соединения ссылается на столбец из increments и столбец из ... подождите минуту, appraisal_lines?Что это такое?Среди тех, кто участвует в объединении, нет таблицы с таким именем.

Я полагаю, что ссылку appraisal_lines.perceived_state в условии объединения следует заменить на appraisal_lines_submitted.current_perceived_state.

Мое другое предположениеВы пропустили LIMIT 1 после ORDER BY, что основано на имени обновляемого столбца (<b>first</b>_perceived_state)

0 голосов
/ 26 мая 2011

Анализатор не может видеть таблицу appraisal_lines, потому что вы обновляете appraisal_lines_submitted.

Единственное место, где вы указываете appraisal_lines внутри внутреннего SELECT, который имеет псевдоним increments

Вы также можете удалить ORDER BY во внутреннем SELECT, объединение будет выполнено независимо от порядка внутренних данных.

...