2011-09-07 28 views
0

我不想使用“循环”相关的关键字,我怎样才能实现循环与基本的SQL命令在甲骨文?
我有两个表:如何在sql中循环?

​​

我想环路B中的所有记录,如果ID = AID,然后设置A.Color = B.Type
提前感谢!

+0

将'sql'标记编辑为'plsql',因为这是针对Oracle的。 –

回答

9

根据定义,循环是一个程序性构造。

SQL是声明性的:告诉数据库你想做什么,而不是如何去做。

如果您完全相信您需要编写这样的程序,然后将其写入Oracle过程语言PL/SQL中。

Bu我相信有可能在SQL中使用带WHERE子句的UPDATE来做你想做的事情。

像这样(每NullUserException校正):

UPDATE A SET A.Color = (SELECT B.Type FROM B WHERE A.ID = B.AID) 
+0

+1同意...... – CharithJ

+0

SQL查询具有非法语法 – NullUserException

+0

@Null:有问题吗?对我来说看起来很好。 – Joe

0

要做到这一点,你将不得不写使用PL/SQL存储过程。 Here是有关该主题的一些信息和论文的oracle页面。

4

的另一种方法:

MERGE INTO a 
USING b 
ON (b.aid = a.id) 
WHEN MATCHED THEN UPDATE SET a.color = b.type; 
+0

+1好的答案。 – NullUserException

0

正如其他人指出的那样,你也许可以用一个正常的DML语句解决您的问题,不涉及任何循环。但是,为了给你如何完成你的要求在PL/SQL,这里是一个例子一些基本...

DECLARE 
    CURSOR c IS 
     SELECT id, aid, type FROM b; 
    statement VARCHAR2(200); 
BEGIN 
    FOR iterator IN c LOOP 
     IF iterator.id = iterator.aid THEN 
      statement := 'UPDATE a SET color = ' || iterator.type || 'WHERE id = ' || iterator.id; 
      EXECUTE IMMEDIATE statement; 
     END IF; 
    END LOOP; 
END; 

这个匿名PL/SQL块将通过表B中的每个记录重复,而如果乙.id = b.aid,它将更新表a并设置a.color = b.type,其中a.id = b.id.

这似乎是你所要求的。这并不是一个有效的方法,因为你在表b中每行都有一个DML语句,它有b.id = b.aid。但我想要更多地将其作为语法示例。这只是通过一种方式遍历游标的一种方式;您还可以显式地打开游标并获取记录,但如果您不需要执行任何操作,而是遍历整个结果集,则这样更容易。