Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Запрос   Найти похожие ветки 

 
glow ©   (2003-09-16 12:51) [0]

Две таблицы связаны один-ко-многим (по регистрационному номеру), условия по двум полям из одной таблицы, и по одному из подчиненной (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 не верно)


 
Johnmen ©   (2003-09-16 13:06) [1]

Неясно, в чем проблема...
М.б. надо ... ON (A.RNOM=P.RNOM) AND (P.Type<>2) ...
И расставь скобки в WHERE.


 
glow ©   (2003-09-16 13:27) [2]


> Например, одной записи в главной табл. с RNOM=1, соответствует
> 4 записи с RNOM=1 в подчиненной,

среди этих 4-х поле: 1-ая запись TYPE=3
2-ая запись TYPE=2
3-ая запись TYPE=1
4-ая запись TYPE=6
т.к. из них одна имеет TYPE=2, то и из главной таблицы брать запись с RNOM=1 не нужно, если бы ни одна из подчиненных записей не имела бы TYPE=2, то запись с RNOM можно было бы включить в выборку.
Надеюсь что понятно


 
Sandman25 ©   (2003-09-16 13:29) [3]

SELECT A.KAT, A.FOB, B.Type
FROM ASPI.db A,
Prikaz.db B
WHERE A.KAT = 1
AND A.FOB = 1
AND B.RNOM = A.RNOM
AND NOT EXISTS
(SELECT *
FROM Prikaz.db C
WHERE C.RNOM = A.RNOM
AND C.Type = 2
)


 
glow ©   (2003-09-16 14:34) [4]


> SELECT A.KAT, A.FOB, B.Type
> FROM ASPI.db A,
> Prikaz.db B
> WHERE A.KAT = 1
> AND A.FOB = 1
> AND B.RNOM = A.RNOM
> AND NOT EXISTS
> (SELECT *
> FROM Prikaz.db C
> WHERE C.RNOM = A.RNOM
> AND C.Type = 2
> )

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


 
Johnmen ©   (2003-09-16 15:01) [5]

>glow © (16.09.03 14:34)
>...запрос выполняется неверно

Не может быть ! Запрос верен.


 
Sandman25 ©   (2003-09-16 16:49) [6]

Попробуйте убрать условие A.FOB = 1
Я же не знал (и до сих пор не знаю :-)) его смысл, поэтому просто тупо его скопировал. Возможно, его нужно засунуть во вложенный (внутренний) select.


 
glow ©   (2003-09-17 05:54) [7]


> Не может быть ! Запрос верен.

Да он выполняется, но в него попадают записи не только А.KAT=1


> A.FOB = 1

Означает обучающиеся очно


 
ЮЮ ©   (2003-09-17 07:47) [8]

>Да он выполняется, но в него попадают записи не только А.KAT=1

Это не может быть. Или твой вариант запроса отличается от предложенного


 
glow ©   (2003-09-17 08:18) [9]


> Вобщем нужно выбрать всех, обучающихся очно, с категорией
> 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 в подчиненной таблице


 
ЮЮ ©   (2003-09-17 09:25) [10]

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

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

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


 
Johnmen ©   (2003-09-17 09:26) [11]

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


 
glow ©   (2003-09-17 09:51) [12]


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

спасибо!


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

Помогите, плиз, откорректировать еще один запрос:
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)


 
Sandman25 ©   (2003-09-17 12:49) [14]

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


 
glow ©   (2003-09-17 12:54) [15]


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

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


 
Sandman25 ©   (2003-09-17 12:58) [16]

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


 
glow ©   (2003-09-17 13:09) [17]


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

Да


 
Sandman25 ©   (2003-09-17 13:13) [18]

Попробуйте убрать 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:14) [19]

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


 
Sandman25 ©   (2003-09-17 13:17) [20]

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


 
glow ©   (2003-09-17 13:20) [21]

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


 
Sandman25 ©   (2003-09-17 13:25) [22]

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


 
glow ©   (2003-09-17 13:26) [23]

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


 
glow ©   (2003-09-17 13:37) [24]

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


 
Sandman25 ©   (2003-09-17 13:39) [25]

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


 
glow ©   (2003-09-17 13:40) [26]


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

Да


 
glow ©   (2003-09-17 13:43) [27]

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


 
Sandman25 ©   (2003-09-17 15:06) [28]

Значит, нельзя иметь параметры во вложенном 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) + """)")



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

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.023 c
1-18405
NickBat
2003-09-25 15:25
2003.10.06
TRichEdit


6-18527
_Андрей_
2003-08-11 14:12
2003.10.06
SendBuf


14-18551
Delirium
2003-09-18 17:12
2003.10.06
DOS Forever


6-18513
Hawk
2003-07-12 16:08
2003.10.06
Измерение иходящего трафика


1-18358
frost
2003-09-23 06:45
2003.10.06
TStream