2012-02-08 58 views
1

如何更新与同一表的另一记录匹配的表字段。如何更新与同一表的另一记录匹配的表字段

UPDATE XXXRLES 
    SET BIZCAT05 = 'S' 
    WHERE (SELECT A.* FROM XXXRLES A, XXXRLES B 
        WHERE 
         A.BIZFLD = B.BIZFLD 
         AND A.BIZOBJ = B.BIZOBJ 
         AND A.BIZRUL = B.BIZRUL 
     ); 

我需要在表XXXRLES的“S”更新域BIZCAT05当且仅当2个记录有以下3个字段值相同:

BIZFLD 
BIZOBJ 
BIZRUL 

如何使这个查询?

+0

有表'XXXRLES'主键吗?名字是什么? – 2012-02-08 10:33:58

+0

没有主键在那里。 – Kishore 2012-02-08 11:07:18

+0

如果您的RDBMS是Oracle,那么我的答案可能会起作用。 – 2012-02-08 11:14:11

回答

2

我已经假设你的RDBMS是Oracle,在你提到ROWID之后发表评论。

UPDATE A SET 
    BIZCAT05 = 'S' 
FROM XXXRLES A 
JOIN XXXRLES B ON 
    A.BIZFLD = B.BIZFLD 
    AND A.BIZOBJ = B.BIZOBJ 
    AND A.BIZRUL = B.BIZRUL 
    AND A.ROWID <> B.ROWID 

或使用exists(看起来更清晰,最后对我来说):

评论后
UPDATE A SET 
    BIZCAT05 = 'S' 
FROM XXXRLES A 
WHERE EXISTS (SELECT 1 
    FROM XXXRLES B 
    WHERE A.BIZFLD = B.BIZFLD 
    AND A.BIZOBJ = B.BIZOBJ 
    AND A.BIZRUL = B.BIZRUL 
    AND A.ROWID <> B.ROWID 
) 

新增

我不熟悉DB2,但你可以请尝试:

UPDATE XXXRLES A SET 
    BIZCAT05 = 'S' 
WHERE EXISTS (SELECT 1 
    FROM XXXRLES B 
    WHERE A.BIZFLD = B.BIZFLD 
    AND A.BIZOBJ = B.BIZOBJ 
    AND A.BIZRUL = B.BIZRUL 
    AND A.ROWID <> B.ROWID 
) 
+0

MY RDBMS是DB2。这两个查询不起作用,因为更新查询中的语法FROM关键字无效... – Kishore 2012-02-08 12:21:09

+0

@Kishore,检查我的编辑。 – 2012-02-08 12:32:38

+0

Powage现在查询是否正常但DB2不支持ROWID/ROWNUM字段...因此查询不起作用 – Kishore 2012-02-08 13:05:13

1

不知道,是正确理解你,试试这个

UPDATE XXXRLES SET BIZCAT05 = 'S' WHERE XXXRLES.ID in 
(SELECT A.ID FROM XXXRLES A,  XXXRLES B 
    WHERE A.BIZFLD = B.BIZFLD AND A.BIZOBJ = B.BIZOBJ AND A.BIZRUL = B.BIZRUL); 
+0

它将无法正常工作。它会更新所有行。 – 2012-02-08 10:53:27

+0

即将发生错误的ID不是表中的列。 – Kishore 2012-02-08 11:08:02

+0

我也尝试此查询UPDATE SET XEXBIZRLES = BIZCAT05 'S' WHERE XEXBIZRLES.ROWID在 (SELECT A.ROWID FROM XEXBIZRLES A,XEXBIZRLES乙 WHERE A.BIZFLD = B.BIZFLD AND A.BIZOBJ = B.BIZOBJ AND A .BIZRUL = B.BIZRUL)。但它更新了表格的所有记录。 – Kishore 2012-02-08 11:09:08

2

您可以使用RID()行标识符的内置功能来识别唯一行。 更新查询可以如下写:

UPDATE XXXRLES A 
SET BIZCAT05 = 'S' 
WHERE EXISTS (SELECT 1 
       FROM XXXRLES B 
       WHERE A.BIZFLD = B.BIZFLD 
       AND A.BIZOBJ = B.BIZOBJ 
       AND A.BIZRUL = B.BIZRUL 
       AND RID(A) <> RID(B) 
      ) 

请找到该IBM DB2信息中心RID()函数的详细信息。 http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.sqlref%2Fsrc%2Ftpc%2Fdb2z_bif_rid.htm

+0

@ Deepa,运行查询时出现错误:表格指示符“A”对表达式无效。 SQLSTATE = 42703对此的任何想法 – Kishore 2012-02-09 05:40:23

+0

@Kishore你可以请尝试与表名称,而不是A? UPDATE XXXRLES SET BIZCAT05 = 'S' WHERE EXISTS(SELECT 1 FROM XXXRLES乙 WHERE XXXRLES.BIZFLD = B.BIZFLD AND XXXRLES.BIZOBJ = B.BIZOBJ AND XXXRLES.BIZRUL = B.BIZRUL AND RID(XXXRLES)<> RID(XXXRLES) ) – Deepa 2012-02-09 12:49:22

相关问题