我有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,将每行的column1
值设置为等于单个DML语句中表A中等效行的column1
值。
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分:0)
听起来您想要进行相关更新。 Oracle中的语法是
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
和tableA
各有4行且每组中都有相同的键组,则不需要tableB
子句。但是,如果column1
中没有匹配的行,则包含该选项会更安全,以避免将tableB
的{{1}}值更新为NULL
。