Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如果table_1.column_a=table_2.column_a,则更新table_1.column_b_Sql_Oracle - Fatal编程技术网

SQL:如果table_1.column_a=table_2.column_a,则更新table_1.column_b

SQL:如果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

我有两张这样的桌子。我想更新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   | 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”。你能告诉我更多的情况吗?