Как исправить неверный идентификатор для объединения в SQL - PullRequest
0 голосов
/ 15 июня 2019

Я получаю проблему с неверным идентификатором при решении этой проблемы: перечислите имя водителя, возраст, должность, средний рейтинг поездки за данный конкретный месяц: апрель

это то, что я пробовал в моем sql.

 CREATE TABLE driver (
    driverID NUMBER(4) PRIMARY KEY, 
    Dname VARCHAR2(20),
    DNRIC CHAR(14),
    Dgender CHAR(1),
    DDOB DATE,
    Dmobile CHAR(11),
    DcarNo CHAR(6),
    Dstart DATE,
    Dstop DATE,
    Dgrade CHAR(6),
    DLicence CHAR(4)
 );


CREATE TABLE booking (
    BookID NUMBER(4) PRIMARY KEY,
    PID NUMBER(4),
    driverID NUMBER(4),    
    PickLoc VARCHAR2(13),
    DropLoc VARCHAR2(13),
    TDate DATE,
    TTime NUMBER(4),
    RideFare CHAR(6),
    TollOther CHAR(6),
    cancelDate DATE,
    TripRating NUMBER(1), 
    PayMethod CHAR(15),
  FOREIGN KEY (PID) references passenger (PID),
  FOREIGN KEY (driverID) references driver (driverID)
 );



SELECT Dname as driver, 
floor(months_between(sysdate,driver.DDOB)/12) as age,
Dgrade as position,
rating
FROM driver
LEFT JOIN 
(SELECT driverID, avg(TripRating) as rating
FROM booking group by driverID
where (TDate between '01-Apr-2019' and '30-Apr-2019')
order by rating) 
booking on driver.driverID = booking.bookingID

я получаю неверный идентификатор в последней строке

Ответы [ 3 ]

0 голосов
/ 15 июня 2019

Столбцы в подзапросе слева от вашего JOIN называются driverID и rating. Итак, используйте

 on driver.driverID = booking.driverID

и все должно работать.

0 голосов
/ 15 июня 2019

Проблема в том, что подзапрос не имеет псевдонима (как упоминалось в других ответах). Я хочу отметить, что вам не нужен подзапрос вообще. Вы можете написать запрос как:

SELECT d.Dname as driver, 
       floor(months_between(sysdate, d.driver.DDOB) / 12) as age,
       d.Dgrade as position,
       avg(b.TripRating) as rating
FROM driver d LEFT JOIN 
     booking b
     ON b.driverID = d.bookingID AND
        b.tDate >= DATE '2019-04-01' AND
        b.tDate < DATE '2019-05-01'
GROUP BY d.Dname, 
         floor(months_between(sysdate, d.DDOB) / 12),
         d.Dgrade
ORDER BY rating;

Некоторые примечания по запросу, однако вы пишете:

  • Псевдонимы таблиц облегчают написание и чтение запроса. Это должны быть сокращения для имен таблиц.
  • Oracle поддерживает ключевое слово DATE для введения констант даты в стандартном формате YYYY-MM-DD.
  • Обратите внимание, что я изменил логику даты, чтобы использовать >= и < вместо BETWEEN. Это особенно важно в Oracle, где тип данных DATE имеет компонент времени, поэтому ваша логика может пропустить Tdates на '2019-04-30', если они имеют компонент времени.
  • При LEFT JOIN условия фильтрации должны быть в предложении ON (ваша версия, в которой они находятся в подзапросе, также работает).
0 голосов
/ 15 июня 2019

Вы используете одно и то же имя для псевдонима столбца и таблицы, которую вы должны использовать

 SELECT Dname as driverName, 
floor(months_between(sysdate,driver.DDOB)/12) as age,
Dgrade as position,
rating
FROM driver
LEFT JOIN  (
    SELECT driverID, avg(TripRating) as rating
    FROM booking
    where TDate between '01-Apr-2019' and '30-Apr-2019'
    group by driverID
) booking on driver.driverID = booking.driverID
order by rating 

Порядок внутри подзапроса не имеет смысла, вы должны поместить предложение на внешний уровень

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