У меня есть две родительские таблицы, как показано ниже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
);
есть способ, который позволит мне взять уникальный идентификатор бронирования и вернуться к геометрии клиента и географии кино 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
1) Добавить FK: ССЫЛКИ клиентов (id) в customer_id в таблице бронирования. 2) аналогично для cinema_id 3) объединить DATE + время в одно временное поле (гораздо проще обрабатывать и сравнивать). 4) Вам просто нужно выбрать «select ... from join B ON ... join c ON ...» type запроса. – wildplasser
Просто google 'SQL JOIN' и прочитайте документы. –
Спасибо, ребята. Ты указал мне в правильном направлении! Я попытался следующий код SELECT (ST_DISTANCE ((SELECT центроид ОТ GISD.CINEMAS INNER JOIN GISD.BOOKING ПО CINEMAS.CINEMA_ID = BOOKING.CINEMA_ID), (SELECT customers_geom ОТ GISD.CUSTOMERS INNER JOIN GISD.BOOKING на клиентов .CUSTOMER_ID = BOOKING.CUSTOMER_ID))) , но получите сообщение об ошибке «более одной строки, возвращенной подзапросом, используемым как выражение» Любые идеи, как обойти это? Я в идеале хочу, чтобы он возвращал расстояние для каждого идентификатора бронирования – user2076033