2012-02-08 64 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