Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Простенький запрос: join только с одной строкой из многих / 5 сообщений из 5, страница 1 из 1
09.11.2011, 23:01
    #37519248
yuriyking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенький запрос: join только с одной строкой из многих
Всем привет.
Помогите пожалуйста написать простенький запрос, а то что-то я туплю.
Есть три таблицы
T1=(PK1, PK2, A1, A2)
T2=(FK1, FK2, A1, A2)
T3=(FK1, FK2, A1, A2)
Их нужно сджойнить по PK1 = FK1 and PK2 = FK2
Проблема в том, что в T3 ключ (FK1, FK2) не уникальный и мне нужно джойнить исключительно со строчкой с максимальным значением атрибута T3.A1.
То есть нужно что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
select * from
T1 join T2
 on T1.PK1 = T2.FK1 and T1.PK2 = T2.FK2
join 
(select * from T3 where T1.PK1 = T3.FK1 and T1.PK2 = T3.FK2 order by T3.A1 desc fetch first  1  row only) AS T3_
 on T1.PK1 = T3_.FK1 and T1.PK2 = T3_.FK2
Этот запрос не работает, как я понимаю, потому, что во внутреннем селекте я не могу ссылаться на T1.
Подскажите пожалуйста куда копать.
Спасибо.
...
Рейтинг: 0 / 0
10.11.2011, 02:02
    #37519353
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенький запрос: join только с одной строкой из многих
yuriyking,

Интересный подход :)

Код: plaintext
1.
2.
3.
4.
5.
select T1.PK1, T1.PK2, T1.A1, T1.A2, T2.A1 as A2_1, T2.A2 as A2_1, T3_.A1 as A3_1
   from T1 join T2 on (T1.PK1, T1.PK2) = (T2.FK1, T2.FK2)
          join
          (select FK1, FK2, MAX(A1) as A1 from T3 group by FK1, FK2) as T3_
             on (T1.PK1, T1.PK2) = (T3_.FK1, T3_.FK2)

Если T3.A2 тоже надо вытащить (если есть несколько строк с максимальным T3.A1, то вытащатся все они, если нужно из них выбрать только одну, то что-то очень криво в задаче):

Код: plaintext
1.
2.
3.
4.
5.
select T1.PK1, T1.PK2, T1.A1, T1.A2, T2.A1 as A2_1, T2.A2 as A2_1, T3_.A1 as A3_1, T3_.A2 as A3_2
   from T1 join T2 on (T1.PK1, T1.PK2) = (T2.FK1, T2.FK2)
          join
          (select * from T3 where (FK1, FK2, A1) IN (select FK1, FK2, MAX(A1) from T3 group by FK1, FK2)) as T3_
             on (T1.PK1, T1.PK2) = (T3_.FK1, T3_.FK2)

Как оптимизатор в этом случае себя поведёт, надо смотреть, могут быть сюрпризы.
...
Рейтинг: 0 / 0
10.11.2011, 11:56
    #37519510
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенький запрос: join только с одной строкой из многих
yuriyking,

Здравствуйте.

Код: plaintext
1.
2.
3.
4.
5.
select * from
T1 join T2
 on T1.PK1 = T2.FK1 and T1.PK2 = T2.FK2
join table
(select * from T3 where T1.PK1 = T3.FK1 and T1.PK2 = T3.FK2 order by T3.A1 desc fetch first 1 row only) AS T3_
 on 1=1
...
Рейтинг: 0 / 0
10.11.2011, 13:38
    #37519858
yuriyking
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенький запрос: join только с одной строкой из многих
Mark Barinstein,
Спасибо, похоже, именно волшебное слово table мне и было нужно.


CawaSPb,
CawaSPbЕсли T3.A2 тоже надо вытащить (если есть несколько строк с максимальным T3.A1, то вытащатся все они, если нужно из них выбрать только одну, то что-то очень криво в задаче):
По условиям задачи согласно прикладной модели данных строка с максимумом всегда одна.
Это просто платежи с датой и возрастающим номером. Мне всегда нужен только последний.
А то что запрос будет нелёгким - понятно. Но он должен максимум один раз в день выполняться.
Надеюсь, проскочим.
...
Рейтинг: 0 / 0
10.11.2011, 13:48
    #37519878
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенький запрос: join только с одной строкой из многих
Марк,

А как такие вещи с точки зрения производительности выглядят?
Честно говоря первый раз сталкиваюсь с таким применением сортировки и "fetch first ...". Этакая каша из декларативной и императивной логики, у оптимизатора крыша не уедет?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Простенький запрос: join только с одной строкой из многих / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]