powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Простенький запрос: join только с одной строкой из многих
5 сообщений из 5, страница 1 из 1
Простенький запрос: join только с одной строкой из многих
    #37519248
yuriyking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Помогите пожалуйста написать простенький запрос, а то что-то я туплю.
Есть три таблицы
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
Простенький запрос: join только с одной строкой из многих
    #37519353
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Простенький запрос: join только с одной строкой из многих
    #37519510
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Простенький запрос: join только с одной строкой из многих
    #37519858
yuriyking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,
Спасибо, похоже, именно волшебное слово table мне и было нужно.


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

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


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