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