2012-01-25 45 views
5

Tôi đang cố tạo một truy vấn PostGIS sử dụng bí danh của câu lệnh JOIN trong câu lệnh FROM, nhưng điều đó là không thể. Có cách nào khác để làm điều đó không?Sử dụng bí danh từ câu lệnh JOIN trong FROM

SELECT DISTINCT 
ST_Buffer(
    ST_Centroid(geom), 
    ST_Area(geom)) 
FROM building AS b, ST_Transform(sg.geometry, 31467) AS geom 
LEFT JOIN surface_geometry AS sg ON b.id = sg.cityobject_id WHERE ST_Area(geom) < 100 

Trả lời

3

Bạn có thể giới thiệu thêm cấp phụ truy vấn con.

Vì vậy, hiện nay bạn có:

SELECT DISTINCT ST_Buffer(ST_Centroid(geom), ST_Area(geom)) 
FROM building AS b, 
    ST_Transform(sg.geometry, 31467) AS geom 
    LEFT JOIN surface_geometry AS sg ON b.id = sg.cityobject_id 
WHERE ST_Area(geom) < 100 

(Tôi đã thay đổi thụt đầu dòng để làm cho ý nghĩa hơn một chút về nó, mặc dù tôi vẫn không hiểu nó: bạn dường như không sử dụng các giá trị từ b bất cứ nơi nào). Bạn cần một cái gì đó như:

SELECT DISTINCT ST_Buffer(ST_Centroid(geom), ST_Area(geom)) 
FROM (
    SELECT ST_Transform(sg.geometry, 31467) AS geom 
    FROM building AS b 
     LEFT JOIN surface_geometry AS sg ON b.id = sg.cityobject_id 
) x 
WHERE ST_Area(geom) < 100 
+1

Cảm ơn bạn! Điều đó hoạt động rất tốt. Tòa nhà là cần thiết bởi vì tôi chỉ muốn các yếu tố surface_geometry có liên quan đến các tòa nhà. Có rất nhiều phần tử surface_geometry có liên quan đến các loại khác. – megges

+0

ah, trong trường hợp đó bạn có thể muốn một sự nối kết bên trong giữa 'building' và' surface_geometry', phép nối ngoài không thực sự hữu ích ở đây. – araqnid

1

Tại sao bạn sẽ không cố gắng:

SELECT DISTINCT 
    ST_Buffer(ST_Centroid(ST_Transform(sg.geometry, 31467), 
       ST_Area(ST_Transform(sg.geometry, 31467))) 
FROM building b LEFT JOIN surface_geometry sg ON (b.id = sg.cityobject_id) 
WHERE ST_Area(ST_Transform(sg.geometry, 31467)) < 100; 

Nó cũng có thể là điều này có thể làm việc:

SELECT DISTINCT 
    ST_Buffer(ST_Centroid(geom), ST_Area(geom)) 
FROM building b LEFT JOIN surface_geometry sg ON (b.id = sg.cityobject_id) INNER JOIN 
    ST_Transform(surface_geometry.geometry, 31467) geom ON (ST_Area(geom) < 100); 

Bạn có thể muốn kiểm tra vị trí của() như tại thời điểm này Tôi không có chỗ để kiểm tra nó.

+0

Cảm ơn câu trả lời. Việc đầu tiên hoạt động nhưng tôi nghĩ rằng nó không phải là rất performant (3 biến đổi trên mỗi hình học) và truy vấn có chứa repititions không cần thiết để nó trở nên phức tạp. Cái thứ hai không hoạt động, nó nói: tham chiếu không hợp lệ đến mệnh đề FROM-entry cho bảng <> – megges

+0

Tôi vừa sửa đổi câu trả lời để có thể sử dụng tên bảng đầy đủ. – Karlson

+0

Lỗi tương tự với bảng đầy đủ. – megges

Các vấn đề liên quan