2013-06-03 2 views
3

Я имею проблему с конкретным подзапросом:подзапросов с нагрузкой INFILE данных

LOAD DATA INFILE 'some_address' INTO TABLE 'some_table' 
FIELDS TERMINATED BY 'field_terminate' ENCLOSED BY '"' 
ESCAPED BY '\\' ('fieldX', 'fieldY'....'fieldZ') 
SET fieldZ= (SELECT Id FROM another_table WHERE Name = fieldZ) 

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

Спасибо за кучу заранее. Я посмотрел по всему Интернету. Пока не повезло, но ..

О, с вышеуказанным запросом я получаю сообщение об ошибке, в основном говорящее, что подзапрос не является скалярным. Очевидно, что подзапрос не используется для выполнения каждой строки, а выполняется для всех полей Z каждой строки, объединенной вместе (поэтому возвращается несколько идентификаторов).

+2

Вы не можете сделать соединение между данными в файле и данных в другой таблице. Вы должны сделать это как две отдельные операции: сначала загрузите таблицу, затем обновите ее, используя соединение с другой таблицей. – Barmar

+0

: (О, дорогой! Ну, я рад, что я проверил, прежде чем вытащить больше из моих волос! – captainspi

+1

Вы также можете установить триггер в таблице, чтобы, если вы вставляете данные, где fieldZ имеет значение null, он может захватить ID из другой_таблицы. Это в основном то же самое, что и двухэтапный процесс, он просто автоматизирует второй шаг для вас. –

ответ

-1

Использовать данные столбца в SET , вы должны поместить его в переменную:

LOAD DATA INFILE 'some_address' INTO TABLE 'some_table' 
    FIELDS 
     TERMINATED BY 'field_terminate' 
     ENCLOSED BY '"' 
     ESCAPED BY '\\' 
('fieldX', 'fieldY', ..., @fieldZ) 
SET fieldZ = (SELECT Id FROM another_table WHERE Name = @fieldZ) 

Это считается, что другое_значение уникально. Если нет, то вам нужно, чтобы заставить подзапрос вернуть 1 строку, например, путем добавления предложения LIMIT:

SET fieldZ = (SELECT Id FROM another_table WHERE Name = @fieldZ LIMIT 1) 
+2

Привет, Билл, я пробовал это раньше, но он не работает, к сожалению. – captainspi