2014-07-24 20 views
0

想法是通過選擇上次同步的開始時間來檢查上次系統同步的時間。問題是,持有的同步信息的表格是新的,因爲它移動到生產的表是空的所以這個查詢打破了系統,因爲它不返回任何東西:SQL案例不存在

select ST_DT_TM 
from SYNCJOBLOG 
where SYS_ID = 'MF' and STAT_CDE = 'FN' 
and SYNC_ID = (select MAX(SYNC_ID) 
       from SYNCJOBLOG 
       where SYS_ID = 'MF' and STAT_CDE = 'FN') 

我試着去的使用的情況下,以檢查是否存在這樣的事的路線:

select case 
      when exists (select ST_DT_TM 
         from SYNCJOBLOG 
         where SYS_ID = 'MF') 
      then ST_DT_TM 
      else '' 
     end as ST_DT_TM 
from SYNCJOBLOG 
where SYS_ID = 'MF' and STAT_CDE = 'FN' 
and SYNC_ID = (select MAX(SYNC_ID) 
       from [XREFDB].[dbo].[SYNCJOBLOG] 
       where SYS_ID = 'MF' and STAT_CDE = 'FN')) 

當事情不存在於表中,然後它的工作原理,但如果沒有的話那麼它返回一個空行集,並打破了系統。如果我拿出外部where子句並且沒有任何東西在表中,那麼它的作用是返回空行,但是如果表中有東西,那麼它返回多行,我不能擁有它。是否有另一種方法去檢查表中是否存在任何內容,如果不存在,則返回一個空行,否則返回最大SYNC_ID的行?

回答

0

我會改變你的系統代碼來檢查重新記錄的記錄數並以這種方式解決你的問題。如果這是不可能的嘗試:

select ST_DT_TM 
from SYNCJOBLOG 
where SYS_ID = 'MF' and STAT_CDE = 'FN' 
and SYNC_ID = (select MAX(SYNC_ID) 
       from SYNCJOBLOG 
       where SYS_ID = 'MF' and STAT_CDE = 'FN') 
union 
select '' 
where not exists(
select 1 
from SYNCJOBLOG 
where SYS_ID = 'MF' and STAT_CDE = 'FN' 
and SYNC_ID = (select MAX(SYNC_ID) 
       from SYNCJOBLOG 
       where SYS_ID = 'MF' and STAT_CDE = 'FN')) 
+0

謝謝!不知道爲什麼我沒有想到這個,但無論如何它幫助我。 – Barrun3

0

試試這個:

select top 1 ST_DT_TM 
from (
    select ST_DT_TM, 
     0 as IsAlternate 
    from SYNCJOBLOG 
    where SYS_ID = 'MF' and STAT_CDE = 'FN' 
    and SYNC_ID = (select MAX(SYNC_ID) 
        from SYNCJOBLOG 
        where SYS_ID = 'MF' and STAT_CDE = 'FN') 

    union all 

    select 0 as ST_DT_TM, 1 as IsAlternate 
) t 
order by IsAlternate; 
0

你不能只是外連接回同一個表,或CTE?

with CTE as (
select MAX(SYNC_ID) as sync_id 
       from SYNCJOBLOG 
       where SYS_ID = 'MF' and STAT_CDE = 'FN') 

select s1.ST_DT_TM 
from SYNCJOBLOG s1 
left outer join CTE 
    on s1.sync_id = cte.sync_id 
where s1.SYS_ID = 'MF' and s1.STAT_CDE = 'FN' 
0

似乎有SYS-IDS = 'MF',但與st_dt_tm空的,所以這應該修復它:

select case 
      when exists (select ST_DT_TM 
         from SYNCJOBLOG 
         where SYS_ID = 'MF') 
      then ST_DT_TM 
      else '' 
     end as ST_DT_TM 
from SYNCJOBLOG 
where SYS_ID = 'MF' and STAT_CDE = 'FN' 
and isnull(st_dt_tm,'')<>'' 
and SYNC_ID = (select MAX(SYNC_ID) 
       from [XREFDB].[dbo].[SYNCJOBLOG] 
       where SYS_ID = 'MF' and STAT_CDE = 'FN'))