2009-11-23 45 views
1

我有2個表 - A和B.表A有兩列,pkey(主鍵)和col1。表B還有兩列,即pr_key(主鍵但不是外鍵)和column1。兩個表都有4行。表B在column1中沒有值,而表A具有所有4行的column1值。所以,我的數據是這樣的如何使用來自其他表的數據同時更新空值的表?

Table A 
pkey col1 
A 10 
B 20 
C 30 
D 40 

Table B 
pr_key column1 
A  null 
B  null 
C  null 
D  null 

我想更新表B設置每行等於一個DML語句從表A中的column1值相當於行的column1值。

+0

DB什麼您使用的是? – 2009-11-23 06:28:29

+0

oracle 10g數據庫 – 2009-11-23 06:37:33

回答

2

應該是類似的東西(取決於您使用,但在一般情況下,下面是相當標準的SQL實現。特別是應在MS-SQL和MySQL的工作。

INSERT INTO tblB (pr_key, column1) 
    SELECT pkey, col1 
    FROM tblA 
    -- WHERE some condition (if you don't want 100% of A to be copied) 

的問題是對於tblB的pr_key的性質有點不清楚,如果由於某種原因,這是該表的默認/自動遞增鍵,那麼它可能會從列表(在括號中)和後面的SELECT中被忽略。這種方式插入每一個新的行後,將產生一個新的值。

編輯:它出現在OP實際上想要更新與A. 值表B,則其語法應該是這樣的

UPDATE tblB 
SET Column1 = A.Col1 
FROM tblA AS A 
JOIN tblB AS B ON B.pr_key = A.pkey 
+0

好的,我很抱歉。由於表B的pr_key是主鍵,所以空值不能插入到表B中。因此,pr_key的值與表A的pkey列相同。表A已經隨意填充4行。 – 2009-11-23 06:40:18

+0

表A PKEY COL1 B 20 \t -C 30 d 40 表B pr_key COLUMN1 空 乙空 C語言的零 d空 欲updaet表B與表A的col1在一起。 – 2009-11-23 06:44:20

+0

@Anupam Ray,檢查編輯我添加UPDATE語法的地方。 (不是100%確定這與Oracle 10g [現在您指定了它]是一致的,但是應該該死的,請檢查Oracle的文檔) – mjv 2009-11-23 07:35:11

0

這聽起來像你想做一個相關的更新。對於在甲骨文的語法是

UPDATE tableB b 
    SET column1 = (SELECT a.column1 
        FROM tableA a 
        WHERE a.pkey = b.pr_key) 
WHERE EXISTS(SELECT 1 
       FROM tableA a 
       WHERE a.pkey = b.pr_key) 

WHERE EXISTS子句不是必要的,如果tableAtableB各自具有4行具有相同的一組中的每個鍵。但是,包含該選項要安全得多,以避免在tableA中沒有匹配的行時將tableB的值更新爲NULL

1

這可能有更好的表現:

MERGE INTO tableB 
USING (select pkey, col1 from tableA) a 
ON (tableB.pr_key = a.pkey) 
WHEN MATCHED THEN UPDATE 
SET tableB.column1 = a.col1; 
+0

它被標記爲10g。沒有10g要求'MERGE'語句有'WHEN NOT MATCHED'部分?我認爲它只有11g可選 – 2012-08-30 01:45:57

+0

不,它在10g中也是可選的。 – 2012-08-30 01:50:53

相關問題