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和不重复的选定列,但仍然没有用。
答案 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;