Как успешно использовать JOIN-запросы? - PullRequest
0 голосов
/ 19 ноября 2018

Это мои схемы:

CREATE TABLE CUSTOMER
(
    customerID numeric,
    name text,
    email varchar(320),
    cell varchar,
    address varchar,
    flag text NULL,
    PRIMARY KEY(customerID)
);

CREATE TABLE REFERRALS
(
    customerID numeric NOT NULL,
    name text NOT NULL,
    PRIMARY KEY(customerID, name)
);

CREATE TABLE RENTAL
(
    customerID numeric NOT NULL,
    model numeric NOT NULL,
    borrowDate timestamp NOT NULL,
    dueDate date NOT NULL,
    charge money NOT NULL,
    returnDate timestamp NULL,
    addFees money NULL,
    notes text NULL,
    PRIMARY KEY(customerID, model, borrowDate)
);

CREATE TABLE SCOOTER
(
    model bigserial NOT NULL,
    manufacturer text NOT NULL,
    country text NOT NULL,
    range numeric NOT NULL,
    weight numeric NOT NULL,
    topspeed numeric NOT NULL,
    condition text NOT NULL,
    availability text NOT NULL,
    PRIMARY KEY(model)
);

Для первого запроса я хочу показать столбцы модели и производителя из SCOOTER, столбец имени из CUSTOMER и столбец dueDate из RENTAL, но только для строк, где SCOOTER.model = RENTAL.model и RENTAL.returnDate is NULL.И, наконец, в порядке убывания по дате.

Это запрос, который я написал:

SELECT 
    s.model, s.manufacturer, c.name, r.duedate 
FROM 
    SCOOTER AS s, CUSTOMER AS c 
INNER JOIN 
    RENTAL AS r ON r.model = s.model AND r.returnDate IS NULL 
ORDER BY 
    r.duedate DESC;

Однако я получаю эту ошибку:

СОВЕТ: есть запись для таблицы "s", нона него нельзя ссылаться из этой части запроса.
ЗАЯВЛЕНИЕ: ВЫБЕРИТЕ s.model, s.manufacturer, c.name, r.duedate ОТ СКУТЕРА КАК s, ЗАКАЗЧИК КАК ВНУТРЕННИЙ ВМЕСТЕ АРЕНДА КАК r ON r.model =s.model AND r.returnDate имеет значение NULL ORDER BY r.duedate desc;

ОШИБКА: недопустимая ссылка на запись предложения FROM для таблицы "s"
ЛИНИЯ 2: ВНУТРЕННЯЯ АРЕНДА В АРЕНДУ, КАК r ON r.model = s.model AND r.returnDate ...
^ СОВЕТ: есть запись для таблицы "s", но на нее нельзя ссылаться из этой части запроса.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вы смешиваете стили соединения, чего следует избегать. Объединения выглядят так:

SELECT * FROM 
a 
INNER JOIN b ON a.column = b.column
INNER JOIN c ON a.column = c.column ...

Каждая строка из a связана с каждой строкой из b, где предложение ON имеет значение true. Затем каждая строка из a-b снова соединяется с C, где предложение ON является истинным. Это приводит к боковому росту данных, когда к ним присоединяется больше данных из большего количества таблиц. Таблицы могут даже быть объединены к себе.

Трудно (и не по теме для SO) углубиться в каждый аспект JOIN, поэтому, возможно, потребуется некоторое чтение фона

0 голосов
/ 19 ноября 2018

Ну, я думаю, вы должны изучить немного лучше SQL. Вы только соединяете таблицу RENTAL и SCOOTER, но не используете соединение с CUSTOMER.

Ваш код, вероятно, должен выглядеть как

SELECT SCOOTER.model, SCOOTER.manufacturer, CUSTOMER.name, RENTAL.duedate
FROM SCOOTER
INNER JOIN RENTAL ON RENTAL.model = SCOOTER.model
INNER JOIN CUSTOMER ON RENTAL.customerID = CUSTOMER.customerID
WHERE RENTAL.returnDate IS NULL ORDER BY RENTAL.duedate desc;

Надеюсь, это поможет!

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...