Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];

Вниз

Помогите с запросом SQL interbase   Найти похожие ветки 

 
Pavel_S   (2002-08-22 14:09) [0]

У меня есть следующие таблицы:
tbl_employees - таблица работников;
tbl_cards - таблица с данными на работников
;

В таблице tbl_cards содержаться данные на работников, причем на одного работника может быть несколько карточек (к примеру, если работник начинает работать над другим проектом, то текущая карточка "закрывается" - указывается дата закрытия и выставляется значение поля closed в 1).

Мне нужно сделать следующие запросы:
-возвратить список работников и лишь их последнюю карточку;
-возвратить всех работников с незакрытыми карточками;
-возвратить список работников и лишь их последнюю незакрытую карточку;


Структура таблиц:

tbl_employees:
-employee_id
-name
-last_name

tbl_cards:
-card_id
-employee_id
-project
-closed
-closed_date


Прошу помочь


 
Val   (2002-08-22 14:21) [1]

как-то уж вы мало задали, заказали бы задачу сразу.
по структуре: поле closed лишнее, поскольку, если closed_date is not null => то это и говорит, что карточка закрыта. работник ведь может в принципе участвовать в нескольких проектах сразу?
лучше использовать классическую таблицу-развязку
link_emp_cards:
-employeeid
-cardid
а из карточек employeeid убрать.


 
Pavel_S   (2002-08-22 14:45) [2]

>> лучше использовать классическую таблицу-развязку

А если у меня еще таблиц двадцать и все связаны с tbl_employees ?

Помогите с запросами, хотябы первый.




 
Val   (2002-08-22 14:58) [3]

>Pavel_S © (22.08.02 14:45)
смотря как связаны, я говорил об отношении many-to-many


 
Ivt_   (2002-08-22 14:59) [4]

Помоему первый запрос реализовать нельзя.
По какому критерию ты определишь последнюю карточку?


 
DmitryK   (2002-08-22 15:01) [5]

-возвратить список работников и лишь их последнюю карточку;

select e.*, c.* from tbl_employees e LEFT JOIN tbl_cards c on e.employee_id=c.employee_id and c.closed=0

запрос точно будет работать в MSSQL, но по идее должен работать и в IB, если все-таки не пойдет можно сделать так

select e.*, c.* from tbl_employees e LEFT JOIN tbl_cards c on e.employee_id=c.employee_id
where c.closed=0


обращаю внимание на c.closed=0, я предпалагаю, что незакрытая карточка помечается как 0. Можно было бы написать c.closed<>1, но тогда врядли удастся использовать индексы.


 
SaS13   (2002-08-22 15:02) [6]

Первое что пришло:
SELECT e.name, card_id = (SELECT c.card_id FROM tbl_cards c WHERE c.employee_id = e.employee_id AND c.card_id = (SELECT MAX(c1.card_id) FROM tbl_cards c1 WHERE c1.employee_id = e.employee_id)) FROM tbl_employees e


 
DmitryK   (2002-08-22 15:07) [7]

В пред. посте если у клиента все карточки закрыты, то возращается NULL в соответствующих полях


 
DmitryK   (2002-08-22 15:15) [8]

-возвратить всех работников с незакрытыми карточками;

Точно такой же код, как я привел на первый вопрос, только заменить LEFT JOIN на INNER JOIN


 
Johnmen   (2002-08-22 15:24) [9]

>Pavel_S ©

Я вот внимательно прочел вопрос и не понял, что значит
"последнюю карточку" ?

>DmitryK © (22.08.02 15:15)

Да нет...Результат одинаков и не соответствует ни одному вопросу...
Но общее направление верно...





 
DmitryK   (2002-08-22 15:26) [10]

-возвратить список работников и лишь их последнюю карточку;

можно сделать еще и так (наверное это будет точнее решать поставленную задачу)

следующий запрос позволяет получить максимальное значение кода карточки для каждого employee_id

select employee_id, max(card_id) from tbl_cards
group by employee_id


 
DmitryK   (2002-08-22 15:28) [11]

2Johnmen ©

> Да нет...Результат одинаков и не соответствует ни одному
> вопросу...
> Но общее направление верно...

Объяснитесь пожалуйста


 
Johnmen   (2002-08-22 15:35) [12]

>DmitryK ©

Пожалуйста...
DmitryK © (22.08.02 15:01) возвратит ВСЕ закрытые карточки, а не последнюю.
Чтобы это был ответ на вопрос №2 его надо подправить.
Аналогично и с DmitryK © (22.08.02 15:15)

Да и вообще все варианты бессмысленны, пока не определено "последнюю карточку" !



 
DmitryK   (2002-08-22 15:36) [13]

После того, как получен максимальный код карточки для каждого клиента, можно получить и более подробную информацию по клиенту и по данной карточке. Но как это лучше сделать слишком сильно зависит от конкретной реализации. Этот запрос надо будет солидно оптимизировать. Например, если реализовать получение всех данных с помощью единого запроса (соединение таблиц LEFT JOIN), это потребует объединения таблицы tbl_cards самой с собой (возможно IB это реализует легко, а в MSSQL6.5 - это значительно увеличивает время обработки запроса).


 
DmitryK   (2002-08-22 15:39) [14]

2Johnmen ©
Читайте пожалуйста посты внимательнее, тот запрос вернет все ОТКРЫТЫЕ карточки.

а по заданию - если работник начинает работать над другим проектом, то текущая карточка "закрывается"


 
Pavel_S   (2002-08-22 15:41) [15]

Более точно запрос был указан SaS13 © - только надо убрать card_id = и поставить уже в конце select"a через пробел

Спасибо SaS13 !!!


 
Pavel_S   (2002-08-22 15:41) [16]

То есть рабочий запрос:

SELECT e.name, (SELECT c.card_id FROM tbl_cards c WHERE c.employee_id = e.employee_id AND c.card_id = (SELECT MAX(c1.card_id) FROM tbl_cards c1 WHERE c1.employee_id = e.employee_id)) card_id FROM tbl_employees e


 
Johnmen   (2002-08-22 15:43) [17]

>DmitryK © (22.08.02 15:39)
>...тот запрос ...

Тот - это который ? И не стоял вопрос о всех незакрытых карт.


 
Pavel_S   (2002-08-22 15:44) [18]

Это ответ на первый вопрос, а как быть с остальными ?


 
DmitryK   (2002-08-22 16:02) [19]


> Тот - это который ? И не стоял вопрос о всех незакрытых
> карт.


2Johnmen ©

тот, на который ты сам ссылался, почитай свои же посты.

2Pavel_S

на второй вопрос, я тебе уже ответил
на третий, используй самый первый запрос, который я тебе прислал

а по первому, если тебе нужны были только имя клиента и код его последней карточи (так бы сразу и писал), то действительно можно воспользоваться тем, что предложил SaS13, только, по моему там есть некоторая избыточность


SELECT e.name, (SELECT MAX(card_id) FROM tbl_cards c WHERE c.employee_id = e.employee_id) FROM tbl_employees e



 
Pavel_S   (2002-08-22 16:17) [20]

спасибо всем !!!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.452 c
3-35623
Дмитрий Калугин
2002-08-22 15:05
2002.09.12
Вычисляемое поле в IB/FB


3-35605
PP
2002-08-22 15:04
2002.09.12
Как сделать РЕФРЕШ базы данных на ИБ6


1-35777
hex_for_delph
2002-08-30 20:15
2002.09.12
Можно-ли узнать название функций в любой Dll. Есть ли специальные


1-35679
7Up
2002-09-02 12:27
2002.09.12
INSTAPI в С. А в Delphi?


1-35764
atmospheric
2002-08-30 16:24
2002.09.12
Распознование текста ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский