查询以使用多个值更新单行

时间:2013-01-08 17:56:34

标签: sql oracle oracle10g

我需要运行以下更新脚本<​​/ p>

update table1 set col1 = 'xxxx', 
col2 = (select cc.client_type
        from table2 t2, table3 t3, table1 t1
        where t2.col3='YYY' 
        AND t3.col4 != 'aaa'
        AND t3.col5 = 'Y'
)

我收到以下错误

Error report:
SQL Error: ORA-01427: single-row subquery returns more than one row
01427. 00000 -  "single-row subquery returns more than one row"

我正在使用Oracle 10g。 对此有何帮助?

2 个答案:

答案 0 :(得分:1)

update table1 t set col1='xxx',
col2= (select cc.client_type from table2 t2, table3 t3
where t2.col3='YYY' 
    AND t3.col4 != 'aaa'
    AND t3.col5 = 'Y'
    AND t2.random_col=t3.random_col)

将更新必要的记录(提供的内部查询只返回一行)。但是,它将是一个常量值(其中random_col是一些可以与table2和table3相关联的列,random_col2是一些可以与table3和table1相关联的列)

另一种可能性是: -

update table1 t set col1='xxx',
    col2= (select cc.client_type from table2 t2, table3 t3
    where t2.col3='YYY' 
        AND t3.col4 != 'aaa'
        AND t3.col5 = 'Y'
        AND t2.random_col=t3.random_col
        AND t3.randome_col2=t.random_col2)

以上将根据table2和table3

更新table1的不同(或相同)值

答案 1 :(得分:0)

您获得的错误是因为,正如其所述,子查询返回多行。您的查询正在使用当前相同的数据更新整个table1。我建议以某种方式加入外部table1引用,以便在子查询中为外部查询中的每一行获取一行。像

这样的东西
update table1 t0 set col1 = 'xxxx', 
col2 = (select cc.client_type
    from table2 t2, table3 t3, table1 t1
    where t2.col3='YYY' 
    AND t3.col4 != 'aaa'
    AND t3.col5 = 'Y'
    AND t0.colx = t1.colx
)