#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
.