收到错误“单行子查询返回多个行”

时间:2019-02-16 02:16:27

标签: sql sql-server

update fct_capital 
     set LINE_ITEM_ID = 
          (select line_item_id 
               from 
                    dim_line_item_capital 
               where LINE_ITEM_DESC
                     in
                         (select CUSTOMER_FIELD7 
                          from fct_capital 
                          where 
                             partition_key like '20180930%' 
                             and STRESS_TESTING_SCENARIO_ID=18544
                          )
           ) 
where 
partition_key 
    like 
     '20180930%' and STRESS_TESTING_SCENARIO_ID=18544 ;

尝试执行上述sql代码时出错,尝试使用max和不重复的选定列,但仍然没有用。

3 个答案:

答案 0 :(得分:0)

我认为您打算进行相关子查询:

update fct_capital
    set LINE_ITEM_ID = (select lic.line_item_id
                        from dim_line_item_capital lic
                        where lic.LINE_ITEM_DESC = fct_capital.CUSTOMER_FIELD7
                       )
    where partition_key like '20180930%' and 
          STRESS_TESTING_SCENARIO_ID = 18544 ;

您可能仍然会重复。如果是这样,您在line_item_desc中有重复项。您可以通过查询找到这些内容:

select lic.line_item_desc
from dim_line_item_capital lic
group by lic.line_item_desc
having count(*) > 1;

答案 1 :(得分:0)

如果查询中的所有内容都很好,那么这可能是查询的可能解决方案。

 GO

 update fct_capital 
 set LINE_ITEM_ID = (select top 1 line_item_id from dim_line_item_capital where 
 LINE_ITEM_DESC in (select CUSTOMER_FIELD7 from fct_capital where 
 partition_key like '20180930%' and STRESS_TESTING_SCENARIO_ID=18544 )) 
 where partition_key like '20180930%' and STRESS_TESTING_SCENARIO_ID=18544 ;

 GO

答案 2 :(得分:0)

这是您的更新语句:

update fct_capital 
set line_item_id = ( <subquery> )
where <conditions>;

因此,对于fct_capital中满足条件的行,将运行子查询以找出将line_item_id设置为哪个值。我们希望该查询返回一个值,例如1234或5678或其他任何值,仅一个值即可更新fct_capital行。

现在让我们看看子查询产生了什么。首先我们有:

select customer_field7 
from fct_capital 
where partition_key like '20180930%' 
and stress_testing_scenario_id = 18544

我不知道这是否返回一行或多行。无论如何,您都为这两种情况做好了准备,因为您在此查询上使用了IN,即可以处理一组值。假设它返回值“ A”,“ B”和“ C”。然后我们有:

select line_item_id 
from dim_line_item_capital 
where line_item_desc in ('A', 'B', 'C')

该查询应该返回我们更新fct_capital行所需的一个值。但是,显然,它返回几个值(当我们寻找多个line_item_desc时可以预期),并且DBMS会引发错误。

您必须将子查询更改为恰好返回一个line_item_id。到目前为止,子查询完全独立于您要更新的行。那是可能的。您将使用相同的值更新所有符合条件的行。这可以通过选择line_item_desc中的一个来完成,例如最伟大的:

select max(line_item_id)
from dim_line_item_capital 
where line_item_desc in ('A', 'B', 'C')

或者您希望子查询与更新的行相关。您可以通过访问子查询中的fct_capital列来完成此操作。

update fct_capital 
set line_item_id =
(
  select line_item_id 
  from dim_line_item_capital lic 
  where lic.line_item_desc = fct_capital.customer_field7
)
where partition_key like '20180930%'
and stress_testing_scenario_id = 18544;