2013-02-16 29 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 
     ;