0

以下のように2つの親テーブルがあります

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
);

ST_Distance を計算するために、一意の予約 ID を取得し、顧客のジオメトリとシネマのジオメトリを参照できるようにする方法はありますか? ある種のネストされたクエリでこれを行うことができると思いますが、うまくいきませんか?

乾杯

更新 (コメントから)

次のコードを試しました:

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ごとに距離を返したい

4

1 に答える 1

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
        ;

次に、スケルトンからの結果を関数の引数として使用して、関数呼び出しを追加します (私は 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
        ;
于 2013-02-17T11:42:08.123 に答える