Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
14-13465
greenrul
2003-05-19 03:31
2003.06.05
Делимся своими историями


3-13023
Брат
2003-05-16 12:41
2003.06.05
Округление в запросе значений DOUBLE до 2х знаков


14-13437
Darts
2003-05-19 10:24
2003.06.05
Понятие


7-13499
Askik
2003-04-02 18:48
2003.06.05
Как подступиться к системному динамику(PC Speaker) через Win2K


3-13051
AtoL2k2
2003-05-16 15:53
2003.06.05
Компонент TDBLookupComboBox





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