2016-03-18 28 views
0

我編寫一個查詢來找到一些記錄...轉換成查詢使用EXISTS

select account_num, mob_tele_feat_uid, mob_tele_feat, done 
from LOAD_MOBILE_DATA lmd1 
where (mob_tele_feat is null and mob_tele_feat_uid is not null) 
    or (mob_tele_feat is not null and mob_tele_feat_uid is null); 

數據表 - 第一個查詢的

4579214598412 223344 {sw_dcf=Gold}|{sw_dcf_active_voice_bsg=Silver}|{sw_cfb=bronze}|{sw_c=bronze} S 
4579214598412 223344                     S 
    null  null null                   P 

輸出---

4579214598412 223344 null S 

我想在更新語句中使用此查詢使用存在如

update load_mobile_data lmd 
    set done = 'P' 
where exists 
    (select account_num, mob_tele_feat_uid, mob_tele_feat, done 
    from LOAD_MOBILE_DATA lmd1 
    where (mob_tele_feat is not null and mob_tele_feat_uid is null) 
     or (mob_tele_feat is null and mob_tele_feat_uid is not null) 
    and lmd.account_num = lmd1.account_num 
    and lmd.mob_tele_feat = lmd.MOB_TELE_FEAT 
    and lmd.MOB_TELE_FEAT_UID = lmd.MOB_TELE_FEAT_UID); 

我要標示爲完成列= P在LOAD_MOBILE_DATA情形之一mob_tele_feat爲null,並且mob_tele_feat_uid不爲空或mob_tele_feat_uid爲空,但mob_tele_feat不爲空

+1

什麼是你的問題? –

+0

如果表中沒有mob_tele_feat,但存在mob_tele_feat_uid,或者存在mob_tele_feat但mob_tele_feat_uid不存在,則需要將load_mobile_data表的done列標記爲'P' – mradul

+0

您發佈的查詢出了什麼問題? –

回答

1

你過度設計的。如果該查詢返回正確的記錄:

select account_num, mob_tele_feat_uid, mob_tele_feat, done 
from LOAD_MOBILE_DATA lmd1 
where (mob_tele_feat is null and mob_tele_feat_uid is not null) 
    or (mob_tele_feat is not null and mob_tele_feat_uid is null); 

然後簡單地改變這樣的:

select account_num, mob_tele_feat_uid, mob_tele_feat, done 
from LOAD_MOBILE_DATA lmd1 

這樣:

update load_mobile_data 
set done = 'P' 
+0

Hehehe :)是的,你是對的,你看我正在做這些驗證,我主要是使用存在的運算符進行驗證數據將變得很大,現在你可以看到....順便謝謝我需要一些討論:) – mradul

+0

但是現在我提出了這個問題,我們可以使用exists操作符來做這個場景嗎? – mradul

0

使用此CTE更新 請修改加盟條件爲每你匹配的列

WITH temptable AS 
    (
     SELECT * FROM load_mobile_data WHERE 
     (mob_tele_feat is null and mob_tele_feat_uid is not null) 
     OR (mob_tele_feat is not null and mob_tele_feat_uid is null) 
    ) 
    UPDATE a SET a.done='P' FROM load_mobile_data a JOIN temptable b 
    ON a.account_num=b.account_num 
0

最簡單的方法是...只是更新你的查詢。

UPDATE (
    select * 
    from LOAD_MOBILE_DATA lmd1 
    where (mob_tele_feat is null and mob_tele_feat_uid is not null) 
     or (mob_tele_feat is not null and mob_tele_feat_uid is null) 
) 
SET done = 'P' 

如果你真的想使用EXISTS操作,那麼你需要使用唯一標識表中的每一行中的主鍵列:

UPDATE LOAD_MOBILE_DATA lmd1 
SET done = 'P' 
WHERE EXISTS (
     select * 
     from LOAD_MOBILE_DATA lmd2 
     where 
      lmd1.id = lmd2.id 
      AND 
      (
      (mob_tele_feat is null and mob_tele_feat_uid is not null) 
      or (mob_tele_feat is not null and mob_tele_feat_uid is null) 
      ) 
) 
+0

感謝您回覆Kordirko – mradul