SQL вопрос(Oracle)

GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

SQL вопрос(Oracle)

Post by GeneDupe »

Скажем, есть такие вот таблицы:

T1 (NAME, CODE)
T2 (CODE, CR_DATE, TYPE)

И такой запрос:
SELECT T1.NAME, MAX(T2.CR_DATE) FROM T1, T2
WHERE T1.CODE = T2.CODE (+)
GROUP BY T1.NAME

Другими словами запрос должен вернуть все записи из T1 + для каждой из них максимальную дату из той группы записей в T2, где CODE соответствует коду из T1 (если такие есть)

Вопрос, как добавить к результату поле TYPE соответствующее возвращенной дате.

Спасибо
Last edited by GeneDupe on 18 Mar 2004 20:27, edited 1 time in total.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Извините совершенный оффтопик
А кто нибудь заметил что ораклисты пишут чаще все uppercase, а ms sqlлисты lowecase ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

Post by GeneDupe »

Дима, ответь на вопрос плз, я знаю, что ты знаешь :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Дело в том что в Oracle надо писать чтото с rank over ....
А я этого синтаксиса не помню потому что в MS SQL его пока нет
Поищите примеры с rank функциями
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

Post by GeneDupe »

Спасибо, посмотрим. А стандартный ANSI SQL? Что-то мне казалось, что это элементарная ситуация, только я что-то не соображу. Я написал с вложенными запросами - медленно выходит.
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

GeneDupe wrote:Спасибо, посмотрим. А стандартный ANSI SQL? Что-то мне казалось, что это элементарная ситуация, только я что-то не соображу. Я написал с вложенными запросами - медленно выходит.

В стандаре этого нет. Если со вложенным запросом медленно - то оптимайзер сакс. При условии, что вложенный запрос написан правильно и есть нужные индексы.
Cheers
GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

Post by GeneDupe »

Не подскажите, как правильно написать такой запрос?
Индексов нет, и это вне моего контроля :?
Evgen
Уже с Приветом
Posts: 1224
Joined: 07 Sep 1999 09:01
Location: Belmont, Ca

Post by Evgen »

select t1. name, t_2.cr_date, t_2.type from
t1 , (
select max( cr_date ) cr_date, code, type from
t2 group by code, type ) t_2
where t1.code=t_2.code (+)
Помогите жертвам валютной ипотеки.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: SQL вопрос(Oracle)

Post by vc »

GeneDupe wrote:Скажем, есть такие вот таблицы:

T1 (NAME, CODE)
T2 (CODE, CR_DATE, TYPE)

И такой запрос:
SELECT T1.NAME, MAX(T2.CR_DATE) FROM T1, T2
WHERE T1.CODE = T2.CODE (+)
GROUP BY T1.NAME

Другими словами запрос должен вернуть все записи из T1 + для каждой из них максимальную дату из той группы записей в T2, где CODE соответствует коду из T1 (если такие есть)

Вопрос, как добавить к результату поле TYPE соответствующее возвращенной дате.

Спасибо


SQL-92:

Code: Select all

select a.name, 
       b.cr_date,
      b.typ1
from t1 a left join
     ( select code, cr_date, typ1
      from t2 where (code, cr_date) in (select code, max(cr_date) from t2 group by code)
    ) b
on a.code=b.code



... below 9i:

Code: Select all


select a.name,
       b.cr_date,
      b.typ1
from t1 a ,
     ( select code, cr_date, typ1
      from t2 where (code, cr_date) in (select code, max(cr_date) from t2 group by code)
    ) b
where a.code=b.code(+)

vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

Evgen wrote:select t1. name, t_2.cr_date, t_2.type from
t1 , (
select max( cr_date ) cr_date, code, type from
t2 group by code, type ) t_2
where t1.code=t_2.code (+)


Unfortunately, your solution contains an error -- it will not select the row with the max data for a given code...

Rgds.
GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

Post by GeneDupe »

Thanks a lot!
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: SQL вопрос(Oracle)

Post by vc »

GeneDupe wrote:Скажем, есть такие вот таблицы:

T1 (NAME, CODE)
T2 (CODE, CR_DATE, TYPE)

И такой запрос:
SELECT T1.NAME, MAX(T2.CR_DATE) FROM T1, T2
WHERE T1.CODE = T2.CODE (+)
GROUP BY T1.NAME

Другими словами запрос должен вернуть все записи из T1 + для каждой из них максимальную дату из той группы записей в T2, где CODE соответствует коду из T1 (если такие есть)

Вопрос, как добавить к результату поле TYPE соответствующее возвращенной дате.

Спасибо


SQL-99:

Code: Select all


select a.name,
       b.cr_date,
      b.typ1
from t1 a left join
     (select code, cr_date, typ1
      from (select code, cr_date, typ1, max(cr_date) over(partition by code) m_date
            from t2)
     where cr_date=m_date
    ) b
on a.code=b.code



Only two FTSs as opposed to three in the SQL-92 solution.

P.S. I substituted typ1 for type because type is a keyword.

VC
GeneDupe
Уже с Приветом
Posts: 188
Joined: 13 May 2003 00:55
Location: USA

Re: SQL вопрос(Oracle)

Post by GeneDupe »

vc wrote:Only two FTSs as opposed to three in the SQL-92 solution.

Thanks, man :)
P.S. I substituted typ1 for type because type is a keyword.
VC

Yes, I know. In the real db the field names are different

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