Форум: "Базы";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизЗапрос Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c