2016-01-06 4 views
0

Я пытаюсь вставить данные в одну таблицу из трех разных таблиц. Как я могу сделать это в одной команде, а не в трех командах «вставить в»?Вставка из трех разных таблиц

drop table osm_street; 
CREATE TABLE osm_street 
( 
Postleitzahl text, 
Ort text, 
Strasse text, 
Hausnummer text 
); 
insert into osm_street (Postleitzahl, Ort, Strasse, Hausnummer) 
select "addr:postcode","addr:city","addr:street", "addr:housenumber" 
from planet_osm_polygon; 

    insert into osm_street (Postleitzahl, Ort, Strasse, Hausnummer) 
    select "addr:postcode","addr:city","addr:street", "addr:housenumber" 
    from planet_osm_point; 

    insert into osm_street (Postleitzahl, Ort, Strasse) 
    select plz99,"addr:city",line.name 
    from planet_osm_line as line , post_pl 
    where ST_Intersects(ST_SetSRID(post_pl.geom, 4326), `ST_Transform(way,4326));` 
+0

Я думаю, 4 столбца из 3 таблиц es имеют одинаковый тип данных, не так ли? –

+0

Просто используйте 'union all', чтобы комбинировать три оператора select (и одну« вставку », конечно) –

ответ

1

Если тип данных каждого столбца в таблицах одинаковы, то вы можете использовать следующий способ

drop table t if exists; 
create table t(id int); 
insert into t(select 2 union all select 3 union all select 5); 

DEMO

Так что ваша вставка заявление должно быть

INSERT INTO osm_street (
     SELECT "addr:postcode" 
     ,"addr:city" 
     ,"addr:street" 
     ,"addr:housenumber" FROM planet_osm_point 

    UNION ALL 

     SELECT "addr:postcode" 
     ,"addr:city" 
     ,"addr:street" 
     ,"addr:housenumber" FROM planet_osm_polygon 

    UNION ALL 

     SELECT plz99 
     ,"addr:city" 
     ,line.NAME,'' FROM planet_osm_line AS line 
     ,post_pl WHERE ST_Intersects(ST_SetSRID(post_pl.geom, 4326), `ST_Transform(way, 4326)) 
     ) 
+0

Скобки вокруг выбора не нужны (и я лично считаю их _very_ отвлекающими) –

+0

этот код очень хороший, но в третья вставка i имеет только два столбца. Из-за этого я получаю сообщение об ошибке. –

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