Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос [Paradox]


Страницы:   1 2

glow ©   (2003-09-16 12:51:00) 

Две таблицы связаны один-ко-многим (по регистрационному номеру), условия по двум полям из одной таблицы, и по одному из подчиненной (Prikaz.db P)P.Type - это числовое поле которое содержит код приказа. Так вот из подчиненной таблицы необходимо вытащить только те записи, которые не имеют приказа с кодом, например, 2.(Например, одной записи в главной табл. с RNOM=1, соответствует 4 записи с RNOM=1 в подчиненной, из которых ни одна не должна иметь TYPE=2). Уважаемые Мастера, помогите реализовать это условие.
SELECT A.KAT, A.FOB, P.Type FROM ASPI.db A LEFT JOIN Prikaz.db P ON A.RNOM=P.RNOM WHERE A.KAT=1 AND A.FOB=1 AND (P.Type<>2)
проблема в выделенном куске (знаю, что <> 2 не верно)


Sandman25   (2003-09-17 15:06:00) [1]

Значит, нельзя иметь параметры во вложенном select.
Поэтому предлагаю вместо параметров G1 и G2 каждый раз изменять текст запроса, вставляя вместо них их значения.
Что-то типа
Query.SQl.Add("SELECT DISTINCT A.RNOM FROM ASPI.db A WHERE (A.KAT = 1)AND EXISTS(SELECT * FROM Prikaz.db C WHERE (C.RNOM = A.RNOM) AND (C.Type = 1) AND C.dat BETWEEN ""1.1." + IntToStr(G) + """ AND ""31.12." + IntToStr(G) + """)")


glow   (2003-09-17 13:43:00) [2]

На
AND C.Dat BETWEEN "01.01.1999" AND "31.12.1999"
прога не ругается


glow   (2003-09-17 13:40:00) [3]


> та же ошибка - это какая? Неправильное использование select?

Да


Sandman25   (2003-09-17 13:39:00) [4]

попробуйте сначала написать AND C.Dat BETWEEN "1.1.1999" AND "31.12.1999"
та же ошибка - это какая? Неправильное использование select?


glow   (2003-09-17 13:37:00) [5]

добавляю AND C.Dat BETWEEN :G1 AND :G2, ошибка та же


glow   (2003-09-17 13:26:00) [6]

Ок, попробую по-вашему:)))


Sandman25   (2003-09-17 13:25:00) [7]

Но Вы же хотите, что прога работала?
1.1.1999 и 31.12.1999 получить достаточно легко. И как я уже писал раньше, такая конструкция будет работать даже быстрее - сравнание дат происходит гораздо быстрее вытаскивания года и его сравнения. Про индексы я уже тоже писал :)


glow   (2003-09-17 13:20:00) [8]

:G это год, например, 1999, этот параметр целого типа, С.Dat - дата, не хотелось бы G к дате преобразовывать


Sandman25   (2003-09-17 13:17:00) [9]

Значит, замените это на выражение из [14] Sandman25 © (17.09.03 12:49)


glow   (2003-09-17 13:14:00) [10]

AND EXTRACT(YEAR FROM C.Dat)=:G без этого работает


Sandman25   (2003-09-17 13:13:00) [11]

Попробуйте убрать WHERE во вложенном запросе. Получится что-то типа

SELECT DISTINCT A.RNOM FROM ASPI.db A WHERE (A.KAT = 1)AND EXISTS(SELECT * FROM Prikaz.db C)

Так работает?


glow   (2003-09-17 13:09:00) [12]


> Странно. Уверены, что привели точный текст запроса? Через
> copy&paste?

Да


Sandman25   (2003-09-17 12:58:00) [13]

Странно. Уверены, что привели точный текст запроса? Через copy&paste?


glow   (2003-09-17 12:54:00) [14]


> И в чем проблема?

Ошибка, что-то вроде "неправильное использование ключевого слова SELECT"


Sandman25   (2003-09-17 12:49:00) [15]

И в чем проблема?
Кстати, я бы лучше написал AND C.Dat BETWEEN :G1 AND :G2.
Тогда можно будет индексом воспользоваться в случае чего.


glow   (2003-09-17 12:46:00) [16]

Помогите, плиз, откорректировать еще один запрос:
SELECT DISTINCT A.RNOM FROM ASPI.db A WHERE (A.KAT = 1)AND EXISTS(SELECT * FROM Prikaz.db C WHERE (C.RNOM = A.RNOM) AND (C.Type = 1) AND EXTRACT(YEAR FROM C.Dat)=:G)


glow   (2003-09-17 09:51:00) [17]


> ЮЮ © (17.09.03 09:25) [10]

спасибо!


Johnmen   (2003-09-17 09:26:00) [18]

Еще раз... Приводи свойзапрос !


ЮЮ   (2003-09-17 09:25:00) [19]

> Нужно получить список регистрационных номеров тех ...

Так и выбирай именно то, что нужно:

SELECT DISTINCT A.RNOM
FROM ...<а далее по-прежнему>


glow   (2003-09-17 08:18:00) [20]


> Вобщем нужно выбрать всех, обучающихся очно, с категорией
> 1, у которых в таблице приказов нет приказа на отчисление
> (TYPE<>2)

По итогам выборки должно получиться 19 записей, в результирующем 52!!!
Скорее всего записи для которых нет приказа TYPE=2 получаем
RNOM=1, KAT=1, FOB=1, Type=3
RNOM=1, KAT=1, FOB=1, Type=1
RNOM=1, KAT=1, FOB=1, Type=5
Нужно получить список регистрационных номеров тех у кого KAT=1, FOB=1 и нет TYPE=2 в подчиненной таблице


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо