我该如何缩短这个SQL?

时间:2012-03-15 09:59:04

标签: sql oracle oracle9i

我运行此命令:

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

如果上面没有重复行,请执行以下操作:

insert into LIST
select * from LIST@LNDB 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 个答案:

答案 0 :(得分:2)

我无法告知SELECT,但您应该被允许同时UPDATE多个字段:

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

编辑:我不明白你为什么需要第二个SELECTLIST@LNDB),但在这两个查询中我都不认为你真的需要所有的字段,所以不要使用{ {1}}对系统来说很重要,只使用并明确地使用主键的字段名称(如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中的WHERE子句对于每一行都将为false,因为0 <0为false。可能还有一种方法可以将UPDATE与命名字段而不是COUNT()一起使用,我不太了解Oracle。

重新编辑:的确,如果您的第二个*实际上是SELECT,您可能需要INSERT :)但我不认为您可以应用相同的技巧*上的INSERT ...

重新编辑:更好地写下我在评论中添加的内容 - 取自http://www.oradev.com/oracle_insert.jsp - 您的唯一请求可能是:

UPDATE

当然,您可以添加GuZzie触控,使用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 LIST@LNDB WHERE JCODE=8 AND KCODE=01 AND LCODE=2011 AND ban IN (SELECT BAN FROM billing_account) DECLAREBEGIN来简化参数的编写;)

答案 1 :(得分: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程序,它应该做你想要的。请注意,您需要替换第1行中的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 LIST@LNDB 
    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;