Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Вложенный запрос, но не просто вложенный  [new]
Андрей Васильевич
Member

Откуда:
Сообщений: 281
Помогите с запросом пожалуйста.
Субд IBM DB2, запрос для TSQLQuery из C++Builder 6. В базу данных внести хранимую процедуру невозможно(нельзя менять структуру).
Структура составлялась не мной и переделать невозможно.
есть 2 таблицы:
*первичный ключ

LST
----------------|
*ID_LST |
IDRG | ---|
DAT_LST | |
----------------| |
| по этим столбцам можно связать таблицы
NAM_LST |
---------------| |
*ID_NL | |
IDRG _NL |----|
NAM_NL |
---------------|

В NAM_LST хранятся имена, а в LST дополнительная информация например дата. В NAM_LST может храниться много имен, но актуальное под последним, то есть максимальным первичным ключом.
Проблема в том чтобы для списка LST.IDRG найти соответствующие максимальные NAM_LST.ID_NL и соответствуюшие им NAM_LST.NAM_NL.
Например для запроса:
select LST.IDRG from LST where LST.DAT_LST>="01.10.2009" and LST.DAT_LST<="20.10.2009"
найти имена NAM_LST.NAM_NL у которых максимальные NAM_LST.ID_NL и соответствует LST.IDRG из запроса выше.
например:
таблица LST
ID_LST IDRG DAT_LST
0 2 15.09.2009
1 5 02.10.2009
2 3 05.10.2009

таблица NAM_LST
ID_NL IDRG _NL NAM_NL
7 2 иванов
8 2 иванцов
9 5 сидоров
10 5 сидоренко
11 3 петров
12 3 петренко
13 3 петрецов


Так вот select LST.IDRG from LST where LST.DAT_LST>="01.10.2009" and LST.DAT_LST<="20.10.2009" возвратит
5
3
а для него дргая, окончательная, часть запроса должна возвратить
седоренко
петрецов
то есть соответствует максимальным 10 и 13.
Как уже не пробовал, не получается. Какойто момент недопонимаю но не знаю какой Заранее спасибо.
20 окт 09, 20:28    [7814201]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос, но не просто вложенный  [new]
Андрей Васильевич
Member

Откуда:
Сообщений: 281
Нарисовать не получилось, такая структура таблиц: LST: *ID_LST IDRG DAT_LST NAM_LST: *ID_NL IDRG _NL NAM_NL Связать можно по LST.IDRG и NAM_LST.IDRG_NL.
Модератор: Тема перенесена из форума "Проектирование БД".


Сообщение было отредактировано: 20 окт 09, 21:29
20 окт 09, 20:33    [7814220]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос, но не просто вложенный  [new]
Добрый Э - Эх
Guest
Андрей Васильевич
Нарисовать не получилось

Видно, плохо старался ;). У меня всё получилось:

LST
----------------|
*ID_LST |
IDRG | ---|
DAT_LST | |
----------------| |
| по этим столбцам можно связать таблицы
NAM_LST |
----------------| |
*ID_NL | |
IDRG _NL |----|
NAM_NL |
----------------|

21 окт 09, 05:19    [7815028]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос, но не просто вложенный  [new]
Добрый Э - Эх
Guest
Что касается основного вопроса топика...
Общую идею решения подобных задач можешь подглядеть вот тут: тынц
21 окт 09, 05:22    [7815030]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос, но не просто вложенный  [new]
Lkhiger
Member

Откуда:
Сообщений: 98
SPEC:

автор
select LST.IDRG
from LST where LST.DAT_LST>="01.10.2009" and LST.DAT_LST<="20.10.2009"

возвратит
5
3

найти имена NAM_LST.NAM_NL у которых максимальные NAM_LST.ID_NL и соответствует LST.IDRG

таблица NAM_LST

ID_NL IDRG _NL NAM_NL
7 2 иванов
8 2 иванцов
9 5 сидоров
10 5 сидоренко
11 3 петров
12 3 петренко
13 3 петрецов

а для него дргая, окончательная, часть запроса должна возвратить
седоренко
петрецов
то есть соответствует максимальным 10 и 13.


Решение:

автор

Select a.NAM_NL
from NAM_LST A
Inner Join
(select max(b.ID_NL) MID_NL, b.IDRG _NL
from NAM_LST b
Inner Join
(select IDRG from LST where LST.DAT_LST between "01.10.2009" and "20.10.2009" ) C
on b.IDRG _NL = c.IDRG
group by b.IDRG _NL ) D

On b.ID_NL = d.MID_NL and a.IDRG _NL = d.IDRG _NL;


Lenny Khiger, ADSPA&VP
21 окт 09, 08:04    [7815113]     Ответить | Цитировать Сообщить модератору
 Correction to the solution  [new]
Lkhiger
Member

Откуда:
Сообщений: 98
I have to correct my small mistake:

Select
a.NAM_NL
from
NAM_LST A
Inner Join
(select max(b.ID_NL) MID_NL, b.IDRG _NL
from NAM_LST b
Inner Join
(select IDRG from LST where LST.DAT_LST between "01.10.2009" and "20.10.2009" ) C
on b.IDRG _NL = c.IDRG
group by b.IDRG _NL ) D


On a.ID_NL = d.MID_NL and a.IDRG _NL = d.IDRG _NL;


Lenny Khiger, ADSPA&VP
21 окт 09, 08:09    [7815120]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос, но не просто вложенный  [new]
Андрей Васильевич
Member

Откуда:
Сообщений: 281
Всем спасибо!!! Самому дошло. 3 вложенных запроса, но у меня без объединений. Просто думал, что если возвращает max например и все, то группировать нельзя. На 100% был уверен. Если нет поля в результате кроме агрегир. ф-ии, то и группировать не по чем. Это недопонимание и подвело. Теперь пересмотрел отношение к group by. Тема закрыта.
21 окт 09, 18:34    [7820128]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос, но не просто вложенный  [new]
Lkhiger
Member

Откуда:
Сообщений: 98
Андрей Васильевич
Всем спасибо!!! Самому дошло. 3 вложенных запроса, но у меня без объединений. Просто думал, что если возвращает max например и все, то группировать нельзя. На 100% был уверен. Если нет поля в результате кроме агрегир. ф-ии, то и группировать не по чем. Это недопонимание и подвело. Теперь пересмотрел отношение к group by. Тема закрыта.

Маладэц !
22 окт 09, 04:03    [7821101]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить