Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос [D6]


Страницы:   1 2

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]

а та на какой СУБДе работаешь ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо