![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хитрый запрос из связанных таблиц [D7, IB6.x]
Mig © (2007-10-16 09:17:00)Добрый день! Не могу придумать как осуществить следующее и можно ли вообще это сделать в запросе? В главной таблице-данные клиента, в подчинённой-даты его явок. Нужно взять данные клиента и его последнюю явку. А второй вариант сложнее:надо взять дату его предпоследней явки и дату последней. Надеюсь на помощь.
Mig (2007-10-17 10:05:00) [1]>ЮЮ © (17.10.07 09:59) [16]
Продолжу завтра. Сегодня некогда. До связи...
ЮЮ (2007-10-17 09:59:00) [2]>Пробовала так. Во-первых без группировки это не идёт,
Ну так покажи, каким получился запрос по subj-евой проблеме.
Mig (2007-10-17 09:53:00) [3]>ЮЮ © (17.10.07 09:46) [14]
Пробовала так. Во-первых без группировки это не идёт, а с группировкой ругается на where.
ЮЮ (2007-10-17 09:46:00) [4]>А вот Немного другая ситуация для запроса:
ситуация абсолютно та же. И принципы "соединения таблиц" те же.
SELECT
c.*,
(
SELECT * FROM Javki j
WHERE
(j.Client = c.Id) and
(j.Date = (select max(data) from Javki where Client = j.client))
)
FROM Сlients c
P.S. Моё отношения к "вложенным" запросам ты уже знаешь :)
Mig (2007-10-17 09:19:00) [5]Всем спасибо за ответы.
А вот Немного другая ситуация для запроса:
В главной таблице-данные клиента, в подчинённой-даты его явок. Нужно взять данные клиента, последнюю явку и значение поля Fieldв день его последней явки.
Т.е. клиент
1 Иванов
2 Петров
Явки:
1 10.10.2000 значение в Field=20
1 10.10.2009 10
т.е. для Иванова надо взять 2 сртроку этой таблицы
Маша Шрайбер (2007-10-16 11:44:00) [6]>> ЮЮ © (16.10.07 10:43) [10]
>> А, кстати, в IB возможна конструкция
Возможна. Но есть нюансы в типе соединения.
Кому интересно - ищите статью на ibase.ru
Sergey13 (2007-10-16 10:57:00) [7]> [10] ЮЮ © (16.10.07 10:43)
> ???
Х.З. Я не пробовал.
Sergey13 (2007-10-16 10:43:00) [8]> [8] ЮЮ © (16.10.07 10:36)
> Отчего же.
Я писал про свой вариант, в твоем будет работать и без группировки. Хотя я уже не уверен, будет ли работать мой вариант с группировкой с учетом наличия и функции и подзапроса на вторую дату. Проверять лень.
ЮЮ (2007-10-16 10:43:00) [9]А, кстати, в IB возможна конструкция
SELECT FROM
TableName t
JOIN StoredProcedureName p ON t.Id = p.Client
???
ЮЮ (2007-10-16 10:36:00) [10]> разумеется без group by не обойтись.
Отчего же. Разве так как в [2], а точнее (по синтаксису) так не работает?
SELECT
c.*,
(SELECT MAX(Date) LastDate FROM Javki j WHERE j.Client = c.Id),
(как в [1], но в where связка таблиц, а не параметр)
FROM Сlients c
Правда, наверное и в IB тоже, запрос в запросе - трудоемкая оперциия и все-таки следует ограничивать выборку из Сlients.
Маша Шрайбер (2007-10-16 10:24:00) [11]>> ЮЮ © (16.10.07 10:02) [5]
>> Не верится, что такое без GROUP BY будет работать.
Совершенно верно, не будет.
Sergey13 (2007-10-16 10:14:00) [12]> [5] ЮЮ © (16.10.07 10:02)
Он же выведет 1 строку.
Хотя я забыл ограничить вывод одним клиентом
where tc.client=:client
Если надо по группе клиентов, разумеется без group by не обойтись.
ЮЮ (2007-10-16 10:02:00) [13]> и далее без изменений.
Не верится, что такое без GROUP BY будет работать.
select tc.client_name, max(data)
from table_clients tc,table_date td
where tc.client=td.client
Anatoly Podgoretsky (2007-10-16 10:00:00) [14]TOP 2
Sergey13 (2007-10-16 09:55:00) [15]> [2] ЮЮ © (16.10.07 09:34)
> И где жн здесь данные из table_clients ?
Ну это же болванка, а не рабочий запрос. Например так
select tc.client_name, max(td.data),
и далее без изменений.
ЮЮ (2007-10-16 09:34:00) [16]>Sergey13 © (16.10.07 09:32) [1]
И где жн здесь данные из table_clients ?
Что-то вроде (в IB, прости, не очень силен)
SELECT
c.*, Select MAX(Date) LastDate FROM Javki j WHERE j.Client = c.Id
FROM Сlients c
За Javki тоже извени - не моя предметная область :)
Sergey13 (2007-10-16 09:32:00) [17]> [0] Mig (16.10.07 09:17)
Ну, второй случай немного посложнее, а в первом то что напрягает? Простейший запрос с max.
Для второго случая
select client, max(data),
(select max(data) from table_date where КЛИЕНТ=:client and data<(select max(data) from table where КЛИЕНТ=:client) ) as data_predposlednja
from table_clients tc,table_date td
where tc.client=td.client
нечто вроде такого.