![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос [D6]
Ann © (2003-05-16 08:43:00)Добрый день!
Никак не могу правильно написать запрос... Подскажите пожалуйста.
Есть вот такой запрос
SELECT
SPR.ART_ID,
SPR.NAME,
SPR.GROUP_ID,
SPR.DELETE_PR,
SPR_A.RDATA,
SPR_A.GOST,
SPR_A.EAN13,
SPR_A.DELETE_PR
FROM
SPRART SPR,
SPRARTP SPR_A
where (SPR_A.ART_ID=SPR.ART_ID) AND SPR_A.RDATA=(SELECT MAX(S.RDATA) FROM SPRARTP S WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=0)
Он вибирает из двух таблиц, причем из второй таблицы записи, соответствующие первой таблице по art_id и с максимальной датой и при условии что delete_pr=0.
Но встала проблема что если во второй таблице нет соответствующей строки с delete_pr=0, то тогда нужно выбрать с максимальной датой и с delete_pr=1.
Подскажите пожалуйста.
united (2003-05-16 14:39:00) [1]а планом запроса не поделитесь? сдается мне, что он смертоубийственный :-)
Ann (2003-05-16 11:09:00) [2]
> Dan
все получилась, со скобками намудрила..
в результате получилось так:
WHERE (SPR_A.ART_ID=SPR.ART_ID)
AND (
( (SPR_A.RDATA=(SELECT MAX(S.RDATA) FROM SPRARTP S
WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=0
AND (SELECT COUNT(*) FROM SPRARTP S WHERE S.DELETE_PR=0 AND S.ART_ID=SPR.ART_ID )<>0))
OR ( (SPR_A.RDATA=(SELECT MAX(S.RDATA) FROM SPRARTP S
WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=1
AND (SELECT COUNT(*) FROM SPRARTP S WHERE S.DELETE_PR=0AND S.ART_ID=SPR.ART_ID )=0))
)))
Так что большое спасибо за совет! :)
Ann (2003-05-16 10:51:00) [3]спасибо! :)
Dan (2003-05-16 10:49:00) [4]Удачи
Ann (2003-05-16 10:45:00) [5]в скобках разобралась..
мысль ясна, спасибо :)
только вот не выдает все записи, которые нужен :(
сейчас еще подумаю... по идее мысль то верна.
Dan (2003-05-16 10:13:00) [6]слушай, а если написать так:
WHERE (SPR_A.ART_ID=SPR.ART_ID) AND
(SPR_A.RDATA=
(SELECT MAX(S.RDATA)
FROM SPRARTP S
WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=0)
AND
(SELECT COUNT(*) FROM SPRARTP WHERE s.DELETE_PR=0)<>0) )
OR
(SPR_A.RDATA=
(SELECT MAX(S.RDATA)
FROM SPRARTP S
WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=1)
AND
(SELECT COUNT(*) FROM SPRARTP WHERE s.DELETE_PR=0)=0) )
)
мог запутаться в скобках...но,я надеюсь, мысь ясна ?
Ann (2003-05-16 10:06:00) [7]да можно...
Dan (2003-05-16 10:03:00) [8]Ann, ты еще на линии ??
Dan (2003-05-16 09:58:00) [9]слущай, а в where можно "у него" писать
(select count(*) from ... WHERE ...)=0)
????
Ann (2003-05-16 09:52:00) [10]:((( тот же вопрос возник..
Dan (2003-05-16 09:49:00) [11]а что он тогда знает ????
Ann (2003-05-16 09:39:00) [12]да нет.. case он тоже не знает
Dan (2003-05-16 09:37:00) [13]наверняка есть что-то похожее на других СУБД...может с case попробовать ? я просто не знаком с этой субдой
Ann (2003-05-16 09:36:00) [14]мда.. то что надо.. вот только в интербейсе я такую функцию никогда не использовала, поэтому и не знаю :(
Fuelfire (2003-05-16 09:35:00) [15]Функция NVL заменяет пустые поля (Null) определенным значением..Но по-моему она реализована не во всех нотациях SQL
Dan (2003-05-16 09:32:00) [16]NVL(x, y) --- if x IS NULL then return y; else return x;
Ann (2003-05-16 09:29:00) [17]а что это вообще за функция NVL? я с такой не сталкивалась
Ann (2003-05-16 09:27:00) [18]ругается на NVL
Dan (2003-05-16 09:21:00) [19]в оракле можно на писать (если я прально понял вопрос):
WHERE (SPR_A.ART_ID=SPR.ART_ID) AND
SPR_A.RDATA=NVL((SELECT MAX(S.RDATA)
FROM SPRARTP S
WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=0),
(SELECT MAX(S.RDATA)
FROM SPRARTP S
WHERE S.ART_ID=SPR.ART_ID AND S.DELETE_PR=1))
Dan (2003-05-16 09:17:00) [20]а та на какой СУБДе работаешь ?