:: Не фоксом единым
Не могу победить команду. Помогите!
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
Исходный текст на MS SQL, который нужно переписать на postgres.
/*update a set a.rest_rub = abs(b.ok)
from #Taccount a
join t_account_bal_hst b on a.account_number = b.number and b.date1 <= @odate2 and b.date_next > @odate2
where a.account_number in (select account_number from #Taccount group by account_number having count(account_number) = 1)
and account_curr <> '643'
and abs(b.ok) <> a.rest_rub
*/
Код на ПГ:
update v_taccount
set v_taccount.rest_rub = abs(d.ok)
from
(select c.* from v_taccount c
join id.t_account_bal_hst b on c.account_number = b.number
and b.date1 <= v_odate2::date and b.date_next > v_odate2::date) d;
and v_taccount.account_number in
(select account_number from v_taccount group by account_number having count(account_number) = 1)
and v_taccount.account_curr <> '643'
and abs(b.ok) <> v_taccount.rest_rub;
*/
Ошибка
SQL Error [42P01]: ERROR: missing FROM-clause entry for table "b"
Где: PL/pgSQL function usp_115_insert_detail(date,date,integer) line 102 at SQL statement.
Я замучилась с этим кусочком.
Как бы я его не изменяла, что бы ни писала, ошибка за ошибкой.
Помогите!



Исправлено 1 раз(а). Последнее : tata, 11.12.22 09:38
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
Может быть:
join id.t_account_bal_hst
Неужели таблица так и называется ?
id.t_account_bal_hst
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
ВладимирС
Может быть:
join id.t_account_bal_hst
Неужели таблица так и называется ?
id.t_account_bal_hst
Да, именно так и называется, еще и лежит в другой схеме, поэтому схему приходится указывать.
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
1. в строке:
and b.date1 <= v_odate2::date and b.date_next > v_odate2::date) d;
в конце точка с запятой... как бы конец команды... хотя вроде пытаетесь продолжить команду update ...

2. Я конечно не вижу полного описания таблиц, особенно v_taccount, чтобы посмотреть полный перечень полей...(есть ли поле уникальности для таблицы)
Ну и т.к. postgresql что то аналогичное с ораклом, то советую посмотреть в сторону команды MERGE (https://www.postgresql.org/docs/current/sql-merge.html)...
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
Победила-таки.
with t as (
select *
from v_taccount as t1
join id.t_account_bal_hst as t2 on t1.account_number = t2.number
and t2.date1 <= v_odate2::date and t2.date_next > v_odate2::date
and t1.account_number in
(select account_number from v_taccount group by account_number having count(account_number) = 1)
and t1.account_curr <> '643'
and abs( t2.ok) <> t1.rest_rub)
update v_taccount
set rest_rub = abs(t.ok)
from t
where t.account_number = v_taccount.account_number;

Насколько правильно, покажет отладка с цифрами, но хотя бы синтаксис не ругается, уже хорошо.
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Звездочку убери

with t as (
select * abs(t.ok) as OK, t1.account_number -- убрать звёздочку, что бы не выбирать лишних данных, вычислить ABS
from v_taccount as t1
join id.t_account_bal_hst as t2 on t1.account_number = t2.number
and t2.date1 <= v_odate2::date and t2.date_next > v_odate2::date
and t1.account_number in
(select account_number from v_taccount group by account_number having count(account_number) = 1)
and t1.account_curr <> '643'
and abs( t2.ok) <> t1.rest_rub)
update v_taccount
set rest_rub = abs(t.ok) -- ABS не нужен, вычислен в cte
from t
where t.account_number = v_taccount.account_number;


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 3 раз(а). Последнее : PaulWist, 13.12.22 11:33
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
Не работает без *.
Ругается, то нет таблицы t, то нет таблицы t1.
Некогда пока разбираться с этим, оставила *.
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Когда то, в начале 90-х, мне показали SQL в FP 2.0.

Это была большая новость после DBase.

Прошло много лет и с тех пор любой SQL запрос в коде приложения я не брезгую оформлять логическими отступами.

TEXT TO lcQuery TEXTMERGE NOSHOW pretext 1+2+4+8
<....>
endtext

А после этого самое главное для, компетентного программера, это владеть бизнес логикой решения в разработке которого они участвуют... Программеры которым пофигу до которого знака округлять суммы в финансовой отчетности не имею права спокойно спать и обязаны принимать лекарства от диареи! Ежедневно!


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 2 раз(а). Последнее : Vedmak, 09.11.23 01:24
Ratings: 0 negative/0 positive
Re: Не могу победить команду. Помогите!
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Актуально?


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 12 (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика