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

Вниз

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

 
Ann ©   (2003-05-16 08:43) [0]

Добрый день!
Никак не могу правильно написать запрос... Подскажите пожалуйста.
Есть вот такой запрос
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.
Подскажите пожалуйста.


 
neXt ©   (2003-05-16 08:52) [1]

ну выбери с инсёртом во временную таблицу сначало записи с датой по условию DELETE_PR=0
вторым запросом, тудажу, выбери по условию в сабквери DELETE_PR=1 причём такие, которые не выбраны в первый раз

и прочти записи из этой таблички


 
neXt ©   (2003-05-16 08:56) [2]

в принцыпе, можно сделать и одним запросом через UNION
в первой части читаешь записис с датой DELETE_PR=0
во второй читаешь записси с датой DELETE_PR=1 для которых нет DELETE_PR=0

с точки зрения производительности, такой вариант может быть хуже, но выглядеть будет компактней


 
Ann ©   (2003-05-16 08:56) [3]

так у меня именно проблема в том что никак не получается написать запрос типа выбрать все по приведенному запросу, а если нет соответствующей строки во второй таблице то выбрать с delete_pr=1 (только при условии что нет соответствующей с 0)


 
Ann ©   (2003-05-16 08:58) [4]


> neXt © (16.05.03 08:56)

а как через Union не подскажешь? никак не могу сообразить :(


 
Rol   (2003-05-16 09:01) [5]

Возьми любую доку по сиквелу и сообразишь :)


 
VAleksey ©   (2003-05-16 09:04) [6]

а если так?
=(SELECT DISTINCT MAX(S.RDATA) FROM SPRARTP S WHERE S.ART_ID=SPR.ART_ID AND (S.DELETE_PR=0 OR S.DELETE_PR=1))


 
neXt ©   (2003-05-16 09:08) [7]

VAleksey © (16.05.03 09:04)
так он вернёт и с DELETE_PR=0 и с S.DELETE_PR=1


 
Ann ©   (2003-05-16 09:10) [8]


> VAleksey © (16.05.03 09:04)

неа так не получится..
тогда если соответствующих записей много, то он выберет максимальную независимо от того какой признак delete_pr, а мне надо чтобы с delete_pr=1 он выбирал только тогда когда с 0 нет


 
neXt ©   (2003-05-16 09:13) [9]


> Ann © (16.05.03 08:58)

а какое СУБД?


 
Ann ©   (2003-05-16 09:16) [10]

fireBird


 
Dan   (2003-05-16 09:17) [11]

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


 
Dan   (2003-05-16 09:21) [12]

в оракле можно на писать (если я прально понял вопрос):
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))


 
Ann ©   (2003-05-16 09:27) [13]

ругается на NVL


 
Ann ©   (2003-05-16 09:29) [14]

а что это вообще за функция NVL? я с такой не сталкивалась


 
Dan   (2003-05-16 09:32) [15]

NVL(x, y) --- if x IS NULL then return y; else return x;


 
Fuelfire   (2003-05-16 09:35) [16]

Функция NVL заменяет пустые поля (Null) определенным значением..Но по-моему она реализована не во всех нотациях SQL


 
Ann ©   (2003-05-16 09:36) [17]

мда.. то что надо.. вот только в интербейсе я такую функцию никогда не использовала, поэтому и не знаю :(


 
Dan   (2003-05-16 09:37) [18]

наверняка есть что-то похожее на других СУБД...может с case попробовать ? я просто не знаком с этой субдой


 
Ann ©   (2003-05-16 09:39) [19]

да нет.. case он тоже не знает


 
Dan   (2003-05-16 09:49) [20]

а что он тогда знает ????


 
Ann ©   (2003-05-16 09:52) [21]

:((( тот же вопрос возник..


 
Dan   (2003-05-16 09:58) [22]

слущай, а в where можно "у него" писать
(select count(*) from ... WHERE ...)=0)
????


 
Dan   (2003-05-16 10:03) [23]

Ann, ты еще на линии ??


 
Ann ©   (2003-05-16 10:06) [24]

да можно...


 
Dan   (2003-05-16 10:13) [25]

слушай, а если написать так:
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:45) [26]

в скобках разобралась..
мысль ясна, спасибо :)
только вот не выдает все записи, которые нужен :(
сейчас еще подумаю... по идее мысль то верна.


 
Dan   (2003-05-16 10:49) [27]

Удачи


 
Ann ©   (2003-05-16 10:51) [28]

спасибо! :)


 
Ann ©   (2003-05-16 11:09) [29]


> 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))
)))


Так что большое спасибо за совет! :)


 
united   (2003-05-16 14:39) [30]

а планом запроса не поделитесь? сдается мне, что он смертоубийственный :-)



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

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

Наверх




Память: 0.53 MB
Время: 0.013 c
1-13208
Программер
2003-05-26 14:37
2003.06.05
Как сделать Fullscreen


3-13004
zubbo
2003-05-19 12:18
2003.06.05
Небоьшой вопрос.


1-13258
OlegM
2003-05-23 10:10
2003.06.05
Вопров по командам Copy, Paste, Cut


1-13217
odyssey
2003-05-27 11:44
2003.06.05
Перемещение файла


14-13470
GigoVich
2003-05-03 20:39
2003.06.05
Карточная Игра - Реально то что возможно...