powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вложенный запрос, но не просто вложенный
8 сообщений из 8, страница 1 из 1
Вложенный запрос, но не просто вложенный
    #36262970
Андрей Васильевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите с запросом пожалуйста.
Субд 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.
Как уже не пробовал, не получается. Какойто момент недопонимаю но не знаю какой Заранее спасибо.
...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36262976
Андрей Васильевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нарисовать не получилось, такая структура таблиц:
LST:
*ID_LST
IDRG
DAT_LST

NAM_LST:
*ID_NL
IDRG _NL
NAM_NL

Связать можно по LST.IDRG и NAM_LST.IDRG_NL.

Модератор: Тема перенесена из форума "Проектирование БД".
...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36263241
Андрей ВасильевичНарисовать не получилось
Видно, плохо старался ;). У меня всё получилось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LST
----------------|
*ID_LST         | 
 IDRG           | ---|
 DAT_LST        |    |
----------------|    |
                     | по этим столбцам можно связать таблицы
NAM_LST              |
----------------|    |
*ID_NL          |    |
 IDRG _NL       |----|
 NAM_NL         |
----------------|

...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36263243
Что касается основного вопроса топика...
Общую идею решения подобных задач можешь подглядеть вот тут: тынц
...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36263290
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36263295
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36265272
Андрей Васильевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо!!! Самому дошло. 3 вложенных запроса, но у меня без объединений. Просто думал, что если возвращает max например и все, то группировать нельзя. На 100% был уверен. Если нет поля в результате кроме агрегир. ф-ии, то и группировать не по чем. Это недопонимание и подвело. Теперь пересмотрел отношение к group by. Тема закрыта.
...
Рейтинг: 0 / 0
Вложенный запрос, но не просто вложенный
    #36265725
Lkhiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей ВасильевичВсем спасибо!!! Самому дошло. 3 вложенных запроса, но у меня без объединений. Просто думал, что если возвращает max например и все, то группировать нельзя. На 100% был уверен. Если нет поля в результате кроме агрегир. ф-ии, то и группировать не по чем. Это недопонимание и подвело. Теперь пересмотрел отношение к group by. Тема закрыта.
Маладэц !
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вложенный запрос, но не просто вложенный
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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