2012-03-15 85 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