2013-02-16 50 views
0

我有两个父表如下使用st_distance父母几何

CREATE TABLE GISD.CUSTOMERS 
(CUSTOMER_ID INTEGER NOT NULL, 
FIRST_NAME VARCHAR (15) NOT NULL, 
SURNAME VARCHAR (20) NOT NULL, 
DATE_OF_BIRTH DATE NOT NULL, 
HOUSE_NUMBER VARCHAR (5) NOT NULL      
POST_CODE VARCHAR(8) NOT NULL, 
STREET VARCHAR (25) NOT NULL, 
TOWN VARCHAR (25) NOT NULL 
); 

SELECT ADDGEOMETRYCOLUMN('gisd','customers', 'customers_geom', '27700','POINT',2); 

CREATE TABLE GISD.CINEMAS 
(CINEMA_ID INTEGER NOT NULL, 
CINEMA_NAME VARCHAR(25) NOT NULL, 
ADDRESS_NUMBER INTEGER NOT NULL, 
POST_CODE VARCHAR(8) NOT NULL, 
STREET VARCHAR (25) NOT NULL, 
TOWN VARCHAR (25) NOT NULL, 
OPENING_TIME TIME NOT NULL, 
CLOSING_TIME TIME NOT NULL 
); 

SELECT ADDGEOMETRYCOLUMN('gisd','cinemas', 'cinemas_geom', '27700','POLYGON',2); 
SELECT ADDGEOMETRYCOLUMN('gisd','cinemas', 'centroid', '27700','POINT',2); 

我有一个使用外键从这两个表作为这样的孩子:

CREATE TABLE GISD.BOOKING 
(BOOKING_ID INTEGER NOT NULL, 
CUSTOMER_ID INTEGER NOT NULL, 
CINEMA_ID INTEGER NOT NULL, 
TIME TIME NOT NULL, 
DATE DATE NOT NULL, 
FILM VARCHAR(50) NOT NULL, 
BOOKING_METHOD VARCHAR (15) NOT NULL, 
BOOKING_FEE NUMERIC NOT NULL -- Numeric is suggested by postgresql.org for currency 
TICKET_PRICE NUMERIC NOT NULL 
); 

是否有一种方法可以让我获取唯一的预订ID并参考客户几何图形和电影地理metry来计算ST_Distance?我假设某种嵌套查询可以做到这一点,但没有运气?

欢呼

UPDATE(从评论)

我曾尝试下面的代码:

SELECT (ST_DISTANCE(
    (SELECT centroid 
     FROM GISD.CINEMAS 
     INNER JOIN GISD.BOOKING ON CINEMAS.CINEMA_ID=BOOKING.CINEMA_ID 
    ),(
     SELECT customers_geom 
     FROM GISD.CUSTOMERS 
     INNER JOIN GISD.BOOKING ON CUSTOMERS.CUSTOMER_ID=BOOKING.CUSTOMER_ID 
    ) 
    )) 

却得到一个错误说“由子查询返回多行作为一种表达'任何想法如何绕过这个?理想情况下,我希望它返回每个预订ID的距离。

+2

1)将FK:REFERENCES customers(id)添加到customer_id的预订表中。 2)cinema_id类似3)将DATE +时间组合成一个时间戳字段(很多easyer需要处理和比较)4)你只需要一个'select ...从一个连接B ON ... join c ON ...'类型的查询。 – wildplasser 2013-02-16 18:15:01

+0

只需google'SQL JOIN'并阅读文档。 – 2013-02-16 18:54:04

+0

谢谢你们。你指引我朝着正确的方向发展!我曾尝试下面的代码SELECT(ST_DISTANCE((SELECT重心 FROM GISD.CINEMAS INNER JOIN GISD.BOOKING ON CINEMAS.CINEMA_ID = BOOKING.CINEMA_ID),(SELECT customers_geom FROM GISD.CUSTOMERS INNER JOIN GISD.BOOKING 客户.CUSTOMER_ID = BOOKING.CUSTOMER_ID))) ,但得到一个错误,说'多个行作为表达式使用子查询返回' 任何想法如何得到这个?我理想的是希望它返回每个预订ID的距离 – user2076033 2013-02-16 18:58:20

回答

1

更正了具有主键/外键和LOWERCASED名称的模式。

DROP SCHEMA tmp CASCADE; 
CREATE SCHEMA tmp; 
SET search_path=tmp; 

CREATE TABLE tmp.customers 
     (customer_id INTEGER NOT NULL PRIMARY KEY 
     , first_name VARCHAR (15) NOT NULL 
     , surname VARCHAR (20) NOT NULL 
     , date_of_birth DATE NOT NULL 
     , house_number VARCHAR (5) NOT NULL 
     , post_code VARCHAR(8) NOT NULL 
     , street VARCHAR (25) NOT NULL 
     , town VARCHAR (25) NOT NULL 
     ); 

SELECT addgeometrycolumn('tmp','customers', 'customers_geom', '27700','POINT',2); 

-- and 

CREATE TABLE tmp.cinemas 
     (cinema_id INTEGER NOT NULL PRIMARY KEY 
     , cinema_name VARCHAR(25) NOT NULL 
     , address_number INTEGER NOT NULL 
     , post_code VARCHAR(8) NOT NULL 
     , street VARCHAR (25) NOT NULL 
     , town VARCHAR (25) NOT NULL 
     , opening_time TIME NOT NULL 
     , closing_time TIME NOT NULL 
     ); 

SELECT addgeometrycolumn('tmp','cinemas', 'cinemas_geom', '27700','POLYGON',2); 
SELECT addgeometrycolumn('tmp','cinemas', 'centroid', '27700','POINT',2); 

-- I have a junction table between these tables as such: 

CREATE TABLE tmp.BOOKING 
     (booking_id INTEGER NOT NULL PRIMARY KEY 
     , customer_id INTEGER NOT NULL REFERENCES tmp.customers (customet_id) 
     , cinema_id INTEGER NOT NULL REFERENCES tmp.cinemas (cinema_id) 
     , zdatetime timestamp NOT NULL 
     , film VARCHAR(50) NOT NULL 
     , booking_method VARCHAR (15) NOT NULL 
     , booking_fee NUMERIC NOT NULL 
     , ticket_price NUMERIC NOT NULL 
     ); 

骨架3路连接:

SELECT bo.booking_id, bo.zdatetime, bo.film 
     , ci.cinemas_geom 
     , ci.centroid 
     , cu.customers_geom 
FROM booking bo 
JOIN customers cu ON cu.customer_id = bo.customer_id 
JOIN cinemas ci ON ci.cinema_id = bo.cinema_id 
     ; 

现在,只需添加函数调用,使用从skeletton作为函数参数的结果(我不是在GIS流利,这只是一个示例来演示语法):

SELECT bo.booking_id, bo.zdatetime, bo.film 
     , st_distance(ci.centroid , cu.customers_geom) AS the_distance 
FROM booking bo 
JOIN customers cu ON cu.customer_id = bo.customer_id 
JOIN cinemas ci ON ci.cinema_id = bo.cinema_id 
     ;