Oracle : Update SQL глючит или я торможу ?

User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

Oracle : Update SQL глючит или я торможу ?

Post by RGoo »

Есть такой вот SQL :

Code: Select all

 UPDATE tw
    SET tw.lf = (SELECT lf.lf
                         FROM lf,
                                   (SELECT MAX(ed)
                                       FROM lf
                                     WHERE da  = tw.da
                                          AND ed <= tw.ed ) lfmax
                     WHERE lf.da = tw.da
                          AND lf.ed = lfmax.ed);


так вот во втором вложенном селекте (где MAX) копмилятор не распознает алиас tw :

ORA-00904: "TW"."ED": invalid identifier

(он и на tw.da тоже ругается, но потом)

Вроде должно работать.... Это я тормоз или он его не видит потому, что это уже другой уровень вложенности ?

P.S. Знаю, стыдно такие вопросы задавать :)
Дочки rulezzz !
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: Oracle : Update SQL глючит или я торможу ?

Post by vc »

RGoo wrote:Есть такой вот SQL :

Code: Select all

 UPDATE tw
    SET tw.lf = (SELECT lf.lf
                         FROM lf,
                                   (SELECT MAX(ed)
                                       FROM lf
                                     WHERE da  = tw.da
                                          AND ed <= tw.ed ) lfmax
                     WHERE lf.da = tw.da
                          AND lf.ed = lfmax.ed);


так вот во втором вложенном селекте (где MAX) копмилятор не распознает алиас tw :

ORA-00904: "TW"."ED": invalid identifier

(он и на tw.da тоже ругается, но потом)

Вроде должно работать.... Это я тормоз или он его не видит потому, что это уже другой уровень вложенности ?

P.S. Знаю, стыдно такие вопросы задавать :)


The identifier is visible only one level down...

Post your create table/indexes and a description of what you to do if you need further help.

VC
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: Oracle : Update SQL глючит или я торможу ?

Post by tengiz »

Возможно, что проблема здесь в том, что (SELECT как таблица) не может быть коррелированным (хотя в данном конкретном случае это ничему не противоречит, так как корреляция делается не на уровне соединяемых таблиц). Поэтому никакие ссылки на колонки из внешних по отношению к нему таблиц не видны. Вот такой эквивателентный подзапрос, который проще и понянтее, должнен работать:

Code: Select all

...
SELECT   lf.lf
FROM   lf
WHERE   lf.da = tw.da
   AND lf.ed =
(
   SELECT   MAX(ed)
   FROM   lf
   WHERE   da = tw.da
      AND
      ed <= tw.ed
)...

Но я не знаю настолько хорошо SQL диалект Oracle и не помню, что говорит стандарт по поводу коррелированных табличных выражений, но в SQL Server, например, они не допускаются.
Cheers
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: Oracle : Update SQL глючит или я торможу ?

Post by vc »

Hello there,

Is it sunny in Seattle yet ;) ?

tengiz wrote:Возможно, что проблема здесь в том, что (SELECT как таблица) не может быть коррелированным (хотя в данном конкретном случае это ничему не противоречит, так как корреляция делается не на уровне соединяемых таблиц). Поэтому никакие ссылки на колонки из внешних по отношению к нему таблиц не видны. Вот такой эквивателентный подзапрос, который проще и понянтее, должнен работать:

Code: Select all

...
SELECT   lf.lf
FROM   lf
WHERE   lf.da = tw.da
   AND lf.ed =
(
   SELECT   MAX(ed)
   FROM   lf
   WHERE   da = tw.da
      AND
      ed <= tw.ed
)...

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


create table t1(x int);

This:

select x, (select count(*) from (select * from t1) where x=abc.x) from t1 abc

.. will work

and this:

select x, (select count(*) from (select * from t1 where x=abc.x)) from t1 abc

... won't (according to the standard, btw).

VC
User avatar
RGoo
Уже с Приветом
Posts: 1917
Joined: 08 Jul 2003 17:42
Location: Canada

Re: Oracle : Update SQL глючит или я торможу ?

Post by RGoo »

vc wrote:The identifier is visible only one level down...


Thanks ! I wasn't sure about that.
Дочки rulezzz !
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: Oracle : Update SQL глючит или я торможу ?

Post by tengiz »

vc wrote:Is it sunny in Seattle yet ;)... ?
Not quite at the moment, but the last week was really beatiful :)

Actually, what I meant as 'not working' is this:

Code: Select all

select * from t1 abc, (select * from t1 where t = abc.t) abc1

It's different from (I had to tweak your code a little in order to make it work for SQL Server)

Code: Select all

select x, (select count(*) from (select * from t1) abc1 where x = abc.x) from t1 abc 
select x, (select count(*) from (select * from t1 where x = abc.x) abc1) from t1 abc

these work fine, btw. If you run them against SQL Server, of course.
Cheers

Return to “Вопросы и новости IT”