2016-08-18 2 views
0

Я пытаюсь выполнить запрос ниже, но я получаю сообщение об ошибке, когда подзапрос пытается вернуть значение, в котором условия не существуют.SQL Subquery Return Null, если данные не совпадают с условием

Может ли кто-нибудь просить простейший способ принудительно вернуть значение по умолчанию, если условие where в подзапросе возвращается пустым.

У меня ошибка, когда я использую дату, когда данные не были записаны, и это дает мне ошибку и выход.

Я пытаюсь получить данные для некоторого анализа R.

использование Продолжительность

SELECT ah1.DateTime,ah1.Value as TPH, 
(select value 
from dbo.AnalogHistory 
where tagname = 'CR_CR001_SPEED.PVAI' 
and datetime = ah1.DateTime 
) as CR_SPEED, 

(select value 
from dbo.AnalogHistory 
where tagname = 'CR_CR001_MOTOR_I.PVAI' 
and datetime = ah1.DateTime 
) as EM_Current, 

(select value 
from dbo.AnalogHistory 
where tagname = 'CR_TE741023G.PVAI' 
and datetime = ah1.DateTime 
) as EM_NDE, 

(select value 
from dbo.AnalogHistory 
where tagname = 'CR_TE741023H.PVAI' 
and datetime = ah1.DateTime 
) as EM_DE 

    FROM [Runtime].[dbo].[AnalogHistory] ah1 
    where TagName = 'CR_WQI752010.PVAI' 
    and wwResolution = '600000' 
    and DateTime > '20160816' 
    and wwRetrievalMode = 'cyclic' 
+0

Если ваша проблема в том, что у вас нет результирующего набора, так как 'DateTime>«20160816'' не возвращает никаких результатов, вы будете иметь, чтобы использовать 'IF EXISTS (SELECT 1 FROM myTable WHERE ) BEGIN ... (мой запрос, если есть результаты) ... END ELSE BEGIN ... (мой запрос, если нет набора результатов) ... END' – ZLK

+0

Привет, ZLK, Другой запрос возвращает как ожидается, с интервалом в 10 минут и будет работать около 20 секунд, а затем сбой с ошибкой данных, обнаруженной на CR_TE741023H, не найденной из-за корреляции по дате. Это связано с периодом времени, когда данные не собирались из-за проблем с сообщением. – GlenCloncurry

+0

Какую ошибку вы на самом деле получаете? – ZLK

ответ

0

Если я правильно понять, вы на самом деле не нужны все те correlated subqueries. Вот еще один вариант использования conditional aggregation:

select DateTime, 
     max(case when TagName = 'CR_WQI752010.PVAI' then Value end) as TPH, 
     max(case when TagName = 'CR_CR001_SPEED.PVAI' then Value end) as CR_SPEED, 
     max(case when TagName = 'CR_CR001_MOTOR_I.PVAI' then Value end) as EM_Current, 
     max(case when TagName = 'CR_TE741023G.PVAI' then Value end) as EM_NDE, 
     max(case when TagName = 'CR_TE741023H.PVAI' then Value end) as EM_DE 
from [Runtime].[dbo].[AnalogHistory] 
where TagName in ('CR_WQI752010.PVAI', 'CR_CR001_SPEED.PVAI', 'CR_CR001_MOTOR_I.PVAI', 
        'CR_TE741023G.PVAI', 'CR_TE741023H.PVAI') 
     and DateTime > '20160816' 
group by DateTime 
having max(case when TagName = 'CR_WQI752010.PVAI' then wwResolution end) = '600000' and 
     max(case when TagName = 'CR_WQI752010.PVAI' then wwRetrievalMode end) = 'cyclic' 
Смежные вопросы