2012-02-02 101 views
-4

我最近有一个问题,我不确定我能否完成。如下所示:'使用单个查询将4个最小的客户ID更新为男性。'我正在使用Oracle。我的未完成代码如下:Sql update查询

create table customer_09 
     (
     custid varchar(5)primary key not null, 
     firstname varchar(20), 
     lastname varchar(20), 
     DOB date, 
     address1 varchar(40), 
     address2 varchar(40), 
     phone varchar(7) 
     ); 


UPDATE customer_09 
SET gender = 'male' 
WHERE custid = (select min(custid) from customer_09) 

如果任何人有正确的代码,请你与我分享。

谢谢

+6

不要在您的表需要一个“性别”一栏? – CloudyMarble 2012-02-02 13:03:04

+1

这是回答'家庭作业'帖子的麻烦。 OP *永远不会*一旦他有了他所需要的东西就会回来。 – Yuck 2012-02-02 13:10:13

+0

算到目前为止,三个Oracle语法不正确,一个后来指出它不是Oracle。一个MySQL语法。一个不是真正的答案...和@a_horse_with_no_name的正确答案。 – Ben 2012-02-02 13:46:41

回答

0

我不熟悉Oracle语法,但是因为你必须更新4条记录,你应该使用某种机制,可以让你限制更新的行数。此外;鉴于您必须根据记录的特定顺序来更新记录,所以您可以使用某种排序机制。

0

我会尝试这样的:

UPDATE customer_09 
SET gender = 'male' 
WHERE custid IN (SELECT custid FROM (select custid from customer_09 ORDER BY custid DESC) WHERE rownum <= 3) 
0

试试这个:

UPDATE customer_09 
SET gender = 'male' 
WHERE custid = (select custid from customer_09 order by custid asc limit 4) 

也许极限指令在Oracle中不工作。 如果不工作尝试WHERE ROWNUM <= 4之前order by

+0

Oracle没有'LIMIT'。 – Yuck 2012-02-02 13:02:28

+0

@chris:不,它不是 – 2012-02-02 14:20:20

+0

我知道,我很抱歉,你之前告诉过我。 – chris 2012-02-02 14:22:55

0

我认为你正在寻找这个

UPDATE customer_09 SET gender = 'male' WHERE custid IN (select custid from customer_09 where rownum <= 4 order by custid asc); 
+1

我希望不是,在与'rownum <='相同的子选择中'order by'不能保证每次都返回相同的东西。 – Ben 2012-02-02 13:44:08

5

当使用ROWNUM限制的结果,这不能在同一“级别”内部完成,通过完成(因为rownumbers在之前分配顺序 ORDER BY完成)。

所以正确的方法应该是这样:

UPDATE customer_09 
SET gender = 'male' 
WHERE custid IN (SELECT custid 
       FROM ( 
        SELECT custid, 
          rownum as rn 
        FROM customer_09 
        ORDER BY custid 
       ) 
       WHERE rn <= 4)