2014-06-26 3 views
0

Я пытался выяснить, почему это дает мне ошибку:MySQL Приготовьте -> Неизвестный столбец в списке полей

PREPARE test FROM 'SELECT t.blah FROM (SELECT ? AS blah) t;'; 

ERROR 1054 (42S22): Unknown column 't.blah' in 'field list'

также:

PREPARE test FROM 'SELECT t.* FROM (SELECT ? AS blah) t;'; 

ERROR 1051 (42S02): Unknown table 't'

Это было бы здорово, если бы кто-то мог пролить свет на эти ошибки. Спасибо!

EDIT: Существует сообщение об ошибке здесь:http://bugs.mysql.com/bug.php?id=71577

Кажется, что обходной путь будет делать:

PREPARE test FROM 'SELECT t.blah FROM (SELECT ? AS blah UNION SELECT ? AS blah) t;'; 
+0

На самом деле я не вижу прецедента для такого утверждения, но я вижу трудности с различием между заполнителем для значения (разрешено) и заполнителем для столбца (недопустимым). – VMai

+0

В приведенном выше примере заполнители предназначены для значений, а не для столбцов. Они разрешены, и это признанная ошибка (см. Ссылку выше). Я намеренно упростил вопрос, чтобы он иллюстрировал концепцию и облегчил ее воспроизведение. –

+0

@BoynanPenev Во-первых, перед редактированием со ссылкой на отчет об ошибке я предположил, что вы использовали бы заполнители для имен столбцов, но после прочтения отчета об ошибке понял, что он должен быть постоянным значением. – VMai

ответ

0

Почему бы не просто использовать:

PREPARE test FROM 'SELECT ? AS blah'; 

Ваш обходной путь дает другой результат.

+0

Мне это нужно для: вставьте в f (id, a, b, c) выберите id, a, b, c from (выберите? как id,? как a,? как b,? как c) t, где не существует (выберите 1 из f, где f .id = t.id и f.tstamp> = t.tstamp) при повторном обновлении ключа a = ta, b = tb, c = tc; в подготовленном заявлении .. Обходной путь дает правильные результаты, если вы делаете несколько строк за строкой. В моем случае. –

+0

UNION между двумя идентичными выбирает: SELECT 'a' как UNION выбирает 'a', поскольку a даст вам тот же результат. Не могли бы вы рассказать о том, как это может привести к другому результату? –