2013-03-12 5 views
1

У меня есть база данных MySQL и вы хотите вставить некоторые данные. В моей БД есть две таблицы с именем tx_yes_cantons и tx_yes_areas."# 1242 - Подзапрос возвращает более 1 строки", а Insert

В таблице кантонов я хочу иметь идентификатор (в моем случае uid) из области. Сейчас, когда я пытаюсь это сделать:

INSERT INTO `tx_yes_cantons` (tx_yes_areas_uid, cantonname, code) 
    VALUES (
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Genferseeregion'), 'Genf', 'ge'), 
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Mittelland'), 'Freiburg', 'fr'), 
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Nordwestschweiz'), 'Basel-Stadt', 'bs'), 
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Zentralschweiz'), 'Obwalden', 'ow'), 
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Tessin'), 'Tessin', 'ti'), 
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Zürich'), 'Zürich', 'zh'), 
     ((SELECT `uid` FROM `tx_yes_areas` WHERE `areaname` Like 'Ostschweiz'), 'Schaffhausen', 'sh'); 

Я получаю ошибку в названии. Зачем? я не вижу ничего плохого ..: S

+0

Пытаться выполнить все запроса на выборку. Некоторые запросы могут возвращать несколько строк. – Dhinakar

ответ

1

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

INSERT INTO `tx_yes_cantons` (tx_yes_areas_uid, cantonname, code) 
SELECT `uid`, 'Genf', 'ge' 
FROM `tx_yes_areas` WHERE `areaname` = 'Genferseeregion' 
UNION ALL 
SELECT `uid`, 'Freiburg', 'fr' 
FROM `tx_yes_areas` WHERE `areaname` = 'Mittelland' 
UNION ALL 
SELECT `uid`, 'Basel-Stadt', 'bs' 
FROM `tx_yes_areas` WHERE `areaname` = 'Nordwestschweiz' 
UNION ALL 
SELECT `uid`, 'Obwalden', 'ow' 
FROM `tx_yes_areas` WHERE `areaname` = 'Zentralschweiz' 
UNION ALL 
SELECT `uid`, 'Tessin', 'ti' 
FROM `tx_yes_areas` WHERE `areaname` = 'Tessin' 
UNION ALL 
SELECT `uid`, 'Zürich', 'zh' 
FROM `tx_yes_areas` WHERE `areaname` = 'Zürich' 
UNION ALL 
SELECT `uid`, 'Schaffhausen', 'sh' 
FROM `tx_yes_areas` WHERE `areaname` = 'Ostschweiz' 

или также:

INSERT INTO `tx_yes_cantons` (tx_yes_areas_uid, cantonname, code) 
SELECT tx_yes_areas.uid, codes.cantonname, codes.code 
FROM 
    tx_yes_areas INNER JOIN (
    SELECT 'Genferseeregion' areaname, 'Genf' cantonname, 'ge' code 
    UNION ALL SELECT 'Mittelland', 'Freiburg', 'fr' 
    UNION ALL SELECT 'Nordwestschweiz', 'Basel-Stadt', 'bs' 
    UNION ALL SELECT 'Zentralschweiz', 'Obwalden', 'ow' 
    UNION ALL SELECT 'Tessin', 'Tessin', 'ti' 
    UNION ALL SELECT 'Zürich', 'Zürich', 'zh' 
    UNION ALL SELECT 'Ostschweiz', 'Schaffhausen', 'sh') codes 
    ON tx_yes_areas.areaname = codes.areaname 
+0

Спасибо, сработало. Но я удалил записи, которые теперь были лишними. Во всяком случае, у меня есть вопрос. Что делает Select вместо VALUES? –

+0

@AgashThamo. если вы не хотите повторять строки, вы можете изменить первый запрос, используя 'UNION' вместо' UNION ALL', или используя 'SELECT DISTINCT tx_yes_areas ... 'на втором, используя VALUES, вы можете вставить только одну строку в время – fthiella

1

Попробуйте выполнить следующий запрос в базе данных:

select areaname, count(*) from tx_yes_areas group by (areaname) having count(*)>1; 

Все возвращаемые результаты будут показаны возможные дубликаты, в случае, любой из areaname подобен один в запросе вставки, затем попробуйте удалить избыточные записи из таблицы tx_yes_areas.

+0

Большое спасибо. Я думал, что у меня нет редких записей. Но у меня было. Моя ложь. Я удалил записи, и это сработало! : D –

Смежные вопросы