![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос [Paradox]
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 в подчиненной таблице