Неверный идентификатор в запросе Oracle 11g - PullRequest
1 голос
/ 16 мая 2019

У меня есть этот запрос, где я получаю ' ORA-00904: "RA". "TARGETRESOURCEID": неверный идентификатор ' в этой строке запроса:

t2.Id IN (SELECT TaskId FROM ResourceAssignment WHERE TargetResourceId = ra.TargetResourceId)

следующий запрос завершен:

Select ra.TargetResourceId, 
(
  SELECT gn.Name FROM GeoNode gn WHERE gn.Id = 
  (
    SELECT t.StartPointId
    FROM Task t 
    WHERE t.Id = 
    (
      SELECT Id FROM
        (SELECT 
          t2.Id
        From 
          Task t2
        WHERE 
          t2.Id IN (SELECT TaskId FROM ResourceAssignment WHERE TargetResourceId = ra.TargetResourceId)
        ORDER BY 
          t2.StartTime1)
      WHERE rownum = 1 
    )
  ) 
) as DepartureNodeName
FROM 
  ResourceAssignment ra
INNER JOIN 
  Vehicle v ON v.Id = ra.SourceResourceId
INNER JOIN
  Unit u ON v.UnitId = u.Id
GROUP BY
    ra.TargetResourceId;

Может ли кто-нибудь идентифицировать проблему, так как я не могу найти проблему.

1 Ответ

3 голосов
/ 16 мая 2019

Проблема в том, что к столбцам из внешнего запроса можно получить доступ только на один уровень подзапроса.Вы пытаетесь получить доступ к внешнему столбцу запроса на несколько уровней подзапроса вниз, поэтому вы получаете это сообщение об ошибке.

Чтобы избежать ошибки, необходимо переписать запрос так, чтобы ваш подзапрос был только на один уровень глубже -что-то вроде этого (не проверено, поскольку вы не предоставили никаких примеров данных и т. д.):

WITH assignment_info AS (SELECT ra.targetresourceid,
                                (SELECT MIN(t.startpointid) KEEP (dense_rank FIRST ORDER BY t.starttime1) task_startpointid
                                 FROM   task t
                                 WHERE  t.id = ra.targetresourceid) task_startpointid
                         FROM   resourceassignment ra
                         INNER  JOIN vehicle v
                         ON     v.id = ra.sourceresourceid
                         INNER  JOIN unit u
                         ON     v.unitid = u.id)
SELECT ai.targetresourceid,
       (SELECT gn.name
      FROM   geonode gn
      WHERE  gn.id = ai.task_startpointid) departurenodename
FROM   assignment_info;

Я не включил ваше предложение GROUP BY ra.targetresourceid, так как агрегатов нет, и ваш запрос будетпотерпеть неудачу из-за этого.Возможно, вы хотели использовать DISTINCT в списке выбора?

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