Eu sou muito novo no PostGIS, PostgreSQL e SQL em geral.
Eu tenho 44 tabelas no meu banco de dados PostGIS e cada uma representa uma camada diferente de dados vetoriais. Cada um foi carregado a partir de um shapefile separado e cada um possui uma coluna que descreve a geometria para essa camada, chamadawkb_geometry
Desejo selecionar um polígono específico em uma camada e recuperar TODA a geometria de um subconjunto de camadas que se sobrepõem à caixa delimitadora desse polígono. Não estou me sentindo exigente quanto ao pedido que será lançado, mas seria útil se ele fosse organizado pelas tabelas de onde cada grupo de geometria veio.
Aqui está um exemplo da minha instrução SQL:
SELECT
ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
table2, table3, table4, table5
WHERE
wkb_geometry &&
(
SELECT
wkb_geometry
FROM
table1
WHERE
ogc_fid = 25
);
que retorna um erro:
column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */
Qual é a maneira certa de fazer isso?
Respostas:
Primeiro, você recebe essa mensagem de erro, porque não especificou de qual tabela deseja selecionar a coluna de geometria (e como todas elas têm o mesmo nome, o postgres está ficando confuso). É por isso que você recebe a mensagem de erro
Se você tiver o mesmo nome de coluna em várias tabelas, adicione sempre o nome da tabela na frente do nome da coluna: por exemplo. table1.wkb_geometry
Para sua consulta: Se eu entendi direito, você deseja encontrar os objetos em diferentes camadas que cruzam um objeto específico em uma camada específica.
Comece a olhar para duas tabelas ao mesmo tempo no início para simplificar:
Tabela1 é a tabela com o objeto específico, tabela2 a tabela com os outros objetos
Agora, se você quiser adicionar objetos adicionais de outras tabelas, precisará de UNION ALL, como Sasa já mencionou. Os nomes das colunas não precisam ser os mesmos, mas o número de colunas e tipos de dados!
Você pode ter problemas ao abrir a consulta em um visualizador, pois não há um ID exclusivo. Uma maneira simples de resolver isso é salvar o resultado como uma tabela com uma coluna de identificação.
diverta-se
fonte
Eu não tenho um cliente SQL na minha frente, portanto, isso pode não ser 100% exato, mas você precisará de algo como:
e assim por diante. Seu problema é que a consulta sql não sabe a qual tabela (tabela 2/3/4/5) você se refere quando especifica SELECT ST_AsEWKT (wkb_geometry), portanto, a referência ambígua. Você também pode adicionar um ORDER BY aos resultados se desejar que eles sejam solicitados
fonte