2012-03-15 86 views
0

我運行此命令:我如何縮短這個SQL?

select * from LIST where JCODE = 8 and 
KCODE = 01 and LCODE = 2011 

如果上述retruns沒有行然後執行以下:

insert into LIST 
select * from [email protected] where JCODE = 8 and 
KCODE = 01 and LCODE = 2011 and ban 
in (select BAN from billing_account) 

Update LIST set STS = null where JCODE = 8 
AND KCODE = 01; 

Update LIST set NO = '1' where JCODE = 8 AND 
KCODE = 01; 

而且我可以使用一些變量在begininng其中 套

JCODE= somevalue 
KCODE= anothervalue 
LCODE=someothervalue 

讓我沒有我每次運行它來編輯每一行。 我使用:

Oracle 9i Enterprise Edition release 9.2.8.0 - 64 bit Production 

回答

2

我不能告訴的SELECT,但你應該立刻被允許UPDATE幾個領域:

UPDATE LIST set STS = null , NO = '1' WHERE JCODE = 8 AND KCODE = 01; 

編輯:我不明白爲什麼你需要第二SELECT(與[email protected]),但在這兩個查詢我不認爲你真的需要所有的字段,所以不是使用SELECT *,這是沉重的系統,只能使用並明確主鍵的字段名稱(如SELECT id FROM ...) 。

而且還有一個辦法做到這一點的一個請求,大概是這樣的:

UPDATE LIST set STS = null , NO = '1' WHERE JCODE = 8 AND KCODE = 01 AND 0<(SELECT COUNT(*) FROM LIST WHERE JCODE = 8 AND KCODE = 01 AND LCODE = 2011); 

這樣一來,如果沒有通過SELECT發現的結果,在UPDATEWHERE條款將是每一行假,因爲0 < 0是錯誤的。也可以使用COUNT()與命名字段而不是*,我不知道Oracle足夠。

重新編輯:的確,如果你的第二個SELECT實際上是一個INSERT,你可能需要一個* :)但我不認爲你可以在INSERT採用同樣的伎倆在UPDATE的一個...

再重新編輯:寫出更好的東西,我把在評論 - 從http://www.oradev.com/oracle_insert.jsp採取 - 你的唯一要求可能是:

INSERT 
WHEN (0=(SELECT COUNT(id) FROM LIST WHERE JCODE=8 AND KCODE=01 AND LCODE=2011)) 
INTO LIST (field1, field2, field3, STS, field4, field5, NO, field6) 
SELECT field1, field2, field3, null, field4, field5, 1, field6 
    FROM [email protected] 
    WHERE JCODE=8 AND KCODE=01 AND LCODE=2011 
    AND ban IN (SELECT BAN FROM billing_account) 

當然,你可以添加GuZzie觸摸,使用DECLAREBEGIN a第二END做出的參數更容易書寫;)

+0

COUNT()可以在Oracle中通配符和字段名被使用,因此你的猜測是正確的:) – GuZzie 2012-03-15 10:24:16

+0

我已經在兩個數據庫有LIST,我需要的coresponding值從LNDB數據庫複製如果列表表我的數據庫是空的。那就是爲什麼我用LIST @ LNDB使用select。 – munish 2012-03-15 10:26:48

+0

那麼是否有一個原因,你不會簡單地將你的整個LIST @ LNDB轉儲到這個DB的列表中? – 2012-03-15 10:31:05

1

您可以將二者結合起來更新查詢。

Update LIST set STS = null, NO = '1' where JCODE = 8 AND KCODE = 01; 

如果你想使用你需要聲明它們,然後變量只是給他們打電話查詢

DECLARE 
    v_JCODE NUMBER := 8; 
    v_KCODE NUMBER := 01; 
    v_LCODE NUMBER := 2011; 

BEGIN 
    Update LIST set STS = null, NO = '1' where JCODE = v_JCODE and KCODE = v_KCODE; 
END; 
/

編輯:由於討論和評論下面我做了一個PL/SQL程序應該做你正在尋找的。請注意,您需要替換第一行中的schemaname.procedure,因爲這是您當前工作的方案中的過程名稱。

CREATE OR REPLACE PROCEDURE schemaname.procedure is 

-- Declare vars 
v_JCODE NUMBER := 8; 
v_KCODE NUMBER := 01; 
v_LCODE NUMBER := 2011; 
v_checkvar NUMBER; 

BEGIN 

    select count(*) 
    into v_checkvar 
    from LIST 
    where JCODE = v_JCODE 
    and KCODE = v_KCODE 
    and LCODE = v_LCODE; 

    if v_checkvar = 0 then 

    insert into LIST 
    select * from [email protected] 
    where JCODE = v_JCODE 
    and KCODE = v_KCODE 
    and LCODE = v_LCODE 
    and ban in (select BAN from billing_account); 

    update LIST 
    set STS = null, NO = '1' 
    where JCODE = v_JCODE 
    and KCODE = v_KCODE; 

    end if; 

END; 
+0

感謝@Guzzie,但是如果我的curent數據庫中的LIST表沒有行,我需要做所有這些......請參閱第一個查詢我如何在PL/SQL中執行這個 – munish 2012-03-15 10:16:32

+0

您可以編程IF循環。用第一個查詢的結果填充變量,然後檢查變量是否由IF循環填充。如果變量爲空/未填充,請執行第二個查詢並執行更新語句。 – GuZzie 2012-03-15 10:20:09

+0

我對SQL不太瞭解,但是我嘗試了谷歌搜索,並嘗試過'如果存在(SELECT ..........)'但它不起作用 – munish 2012-03-15 10:30:04