Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.51 MB
Время: 0.008 c
3-18247
muzzzy
2003-09-16 10:14
2003.10.06
из DBGRID В dbf файл.


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


3-18271
Фагот
2003-09-15 10:26
2003.10.06
Индексы


4-18688
likeanangel
2003-08-01 16:42
2003.10.06
Использование пера с паттерном


14-18622
IGOREK
2003-09-17 17:30
2003.10.06
Посоветуйте русско-украинский переводчик...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский