Как использовать значение столбца в одном из операторов select в соединении в postgresql

#postgresql #inner-join

Вопрос:

Я обновляю sitename , как показано ниже. Но затем мне нужно использовать levelindex » от a » в другом запросе, который соединяется с первым запросом.

 update billofquantity_temp a
    set sitename = b.boqitemname 
from (
 select a.* from
 (
 select levelindex,productno,boqitemid,boqitemname,fileid from billofquantity_temp
                where productno ='' and levelindex !='' //first query
 ) a
    join 
 (
 select distinct substring(levelindex,1,length(a.levelindex) lblindex from billofquantity_temp
               where boqitemid !='' and levelindex !='' 
               and length(levelindex) > 2
 ) b    on a.levelindex=b.lblindex // second query 
) b
where a.levelindex=b.levelindex; 
 

Мне нужно использовать a.levelindex во втором запросе, чтобы получить подстроки его длины. Но это приводит к ошибке invalid reference to FROM-clause entry for table "a"

Есть ли какой — либо другой способ использовать столбец из запроса 1 во 2 при присоединении к ним?

Обновление: Основываясь на ответе кимса, я мог бы выполнить выбор, но есть ошибка syntax error at c.a.levelindex . Там ошибка выбрасывается даже с c.levelindex . Небольшое изменение запроса не привело к ошибкам, но намеренного обновления не произошло. Вместо этого обновляется только одно конкретное значение. Ниже приведен обновленный запрос для устранения ошибок

  update billofquantity_temp d
 set sitename = c.boqitemname
 from (
      select *  from (
            select levelindex, boqitemname from billofquantity_temp
            where productno = '' and levelindex != '' -- first query
                     ) a
                join (
            select distinct levelindex lblindex from billofquantity_temp
            where boqitemid != '' and levelindex != '' and length(levelindex) > 2   ) b
on a.levelindex = substring(b.lblindex, 1, length(a.levelindex)) -- second query
      ) c 
       where d.levelindex = c.lblindex;
 

Комментарии:

1. может быть, попробуйте использовать четыре разных идентификатора вместо a двух и b двух

Ответ №1:

Переместите вычисление lblindex вне поднабора в on предложение:

 update billofquantity_temp d
set sitename = c.boqitemname
from (
    select *
    from (
        select levelindex, boqitemname
        from billofquantity_temp
        where productno = '' and levelindex != '' -- first query
    ) a
    join (
        select distinct levelindex
        from billofquantity_temp
        where boqitemid != '' and levelindex != '' and length(levelindex) > 2     
    ) b
    on a.levelindex = substring(b.levelindex, 1, length(a.levelindex)) -- second query
) c 
where d.levelindex = c.a.levelindex
;
 

Я также использовал c и d , чтобы избежать путаницы при использовании a и b дважды , добавил отсутствующие ) и удалил неиспользуемые поля из select .

Комментарии:

1. Это бросает Column reference level index is ambiguous в c.levelindex

2. Попробуй c.a.levelindex .