SQL:如果table_1.column_a=table_2.column_a,则更新table_1.column_b
我有两张这样的桌子。我想更新table_1.column_b如果table_1.column_a=table_2.column_a 表1SQL:如果table_1.column_a=table_2.column_a,则更新table_1.column_b,sql,oracle,Sql,Oracle,我有两张这样的桌子。我想更新table_1.column_b如果table_1.column_a=table_2.column_a 表1 column_a | column_b ---------------------------- X1 | 0 X2 | 0 X3 | 0 X4 | 0 X5 | 0 column_a | c
column_a | column_b
----------------------------
X1 | 0
X2 | 0
X3 | 0
X4 | 0
X5 | 0
column_a | column_b
----------------------------
X1 | 1
X2 | 1
X3 | 1
X4 | 0
X5 | 0
表2
column_a
--------
X1
X2
X3
结果应该是:
表1
column_a | column_b
----------------------------
X1 | 0
X2 | 0
X3 | 0
X4 | 0
X5 | 0
column_a | column_b
----------------------------
X1 | 1
X2 | 1
X3 | 1
X4 | 0
X5 | 0
这是一种可能的解决方案:
update table_1 a
set a.column_b = 1
where a.column_a in (select * from table_2);
有关“在何处存在选择1”的其他信息。我只是想补充一下,以防万一。这是防御性编程
不完全确定是否需要它,在本例中为,因为我假设count(*)子查询将为上面表a中的X4和X5项返回0
假设你是这样做的。。。(下面选择中的1并不重要,它可以是表2中的任何数字或数字列(如果有)。重要的是,我们这次没有进行计数(*),因此X4和X5不会从表2中得到任何信息
update table_1
set column_b =
(select 1
from table_2 s
where table_1.column_a = s.column_a
)
在这种情况下,X4和X5将不会得到子查询结果,Oracle将尝试为这些行的表_1.column_b分配null如果该列设置为NOTNULL,则会出现错误。
通过在查询末尾添加where exists,您告诉Oracle不要尝试更新没有匹配表_2行的表_1。所以这个更新空值问题永远不会发生
样板文件的基本思想是在需要更新列时首先限定更新子查询。然后在查询结束时将这些条件作为where exists重复,以避免Oracle在子查询不返回任何内容的情况下尝试更新
注意,我可以将count()留在where exists子查询中。除了我只寻找匹配行的存在性,而实际上我对count()不感兴趣,所以我通过让Oracle选择一个“更便宜”的结果集进行了一些优化
如果您有多个具有不同子查询条件的列更新,那么这将不起作用。您必须将更新拆分为不同的查询。或者使用Oracle NVL()捕获空值并替换它们。U rock!这是工作。问题是我不知道你上面提到的“选择1”。你能告诉我更多的情况吗?