подзапрос из ссылки SELECT, получает "не может быть ссылка из этой части запроса" - PullRequest
0 голосов
/ 16 ноября 2018

Я имею дело с этим вопросом Я знаю простой совокупный ответ, но я решил попытаться бросить вызов себе с помощью подзапросов.

SELECT outercm.surname, outercm.firstname, outercm.memid, subq.starttime
FROM cd.members outercm,
(
SELECT cm.memid, cb.starttime
from cd.members cm
JOIN cd.bookings cb ON cb.memid = cm.memid
WHERE cm.memid = outercm.memid
AND
DATE(starttime ) >= '01-09-2012'
ORDER BY cb.starttime
LIMIT 1
  ) as subq

И я получаю эту ошибку:

Существует запись для таблицы "externalcm", но на нее нельзя ссылаться из этой части запроса.

Я также пробовал подзапросы из FROM:

SELECT outercm.surname, outercm.firstname, outercm.memid, 
(
  SELECT cb.starttime
  from cd.members cm
  JOIN cd.bookings cb ON cb.memid = cm.memid
  WHERE cm.memid = outercm.memid
  AND
  DATE(starttime ) >= '01-09-2012'
  ORDER BY cb.starttime
  LIMIT 1 
) 
FROM cd.members outercm

И я получаю это сообщение:

java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: -1

Яне уверен, когда и как я могу ссылаться между внутренними и внешними запросами.Спасибо за помощь

1 Ответ

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

В Postgres, DISTINCT ON может использоваться для получения результатов по максимальному / минимальному количеству строк в группе, в вашем примере - «первое бронирование».Как правило, это гораздо эффективнее по сравнению с другими параметрами, такими как GROUP BY + MIN() или использованием LIMIT в коррелированном подзапросе.

SELECT DISTINCT ON ( cm.memid ) cm.surname, 
   --get the first among memid  
                                cm.firstname, 
                                cm.memid, 
                                cb.starttime 
FROM   cd.members cm 
       join cd.bookings cb 
         ON cb.memid = cm.memid 
            AND cb.starttime >= TIMESTAMP '2012-09-01' 
ORDER  BY cm.memid,     --for each memid 
          cb.starttime; --that has the earliest date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...