如何在PostgreSQL中使用join更新多行
我在SQL Server中有此更新:如何在PostgreSQL中使用join更新多行,sql,sql-server,postgresql,Sql,Sql Server,Postgresql,我在SQL Server中有此更新: UPDATE #actives SET liquidity = CASE WHEN a.ativ_day_conv <> '19000101' THEN DATEDIFF(d, @Dt_fin, b.bond_vcto) WHEN b.bond_liquidity = -1 THEN DATEDIFF(d, @D
UPDATE #actives
SET
liquidity = CASE
WHEN a.ativ_day_conv <> '19000101'
THEN DATEDIFF(d, @Dt_fin, b.bond_vcto)
WHEN b.bond_liquidity = -1
THEN DATEDIFF(d, @Dt_fin, b.bond_vcto)
WHEN DATEDIFF(d, @Dt_fin, DATEADD(d, b.bond_liquidity, a.minor_date)) > 0
THEN DATEDIFF(d, @Dt_fin, DATEADD(d, b.bond_liquidity, a.minor_date))
ELSE 0
END
FROM #actives a
INNER JOIN rc_bonds b ON b.ativ_id = a.ativ_id
INNER JOIN rc_actives x ON x.ativ_id = a.ativ_id
INNER JOIN rc_group_actives g ON g.grat_id = x.grat_id
AND g.grat_compromisse_sn = 'n';
UPDATE#活动
设置
流动性=案例
当a.ativ_day_conv‘19000101’
然后DATEDIFF(d,@Dt_fin,b.bond_vcto)
当b.bond_流动性=-1时
然后DATEDIFF(d,@Dt_fin,b.bond_vcto)
当DATEDIFF(d,@Dt_fin,DATEADD(d,b.bond_liquity,a.minor_date))大于0时
然后是DATEDIFF(d,@Dt_fin,DATEADD(d,b.债券流动性,a.次要日期))
其他0
结束
从#激活a
b.ativ_id=a.ativ_id上的内部连接rc_键b
内部联接rc_在x.ativ_id=a.ativ_id上激活x
内部连接rc_组在g.grat_id=x.grat_id上激活g
g.grat_seu sn='n';
我在PostgreSQL中有“相同”的更新逻辑:
UPDATE actives a
SET
liquidity = CASE
WHEN a.ativ_day_conv <> '19000101'
THEN DATE_PART('day', b.bond_vcto - p_Dt_fin)
WHEN b.bond_liquidity = -1
THEN DATE_PART('day', b.bond_vcto - p_Dt_fin)
WHEN DATE_PART('day', DATEADD('d'::varchar(1), b.bond_liquidity::int, a.minor_date) - p_Dt_fin) > 0
THEN DATE_PART('day', DATEADD('d'::varchar(1), b.bond_liquidity::int, a.minor_date) - p_Dt_fin )
ELSE 0
END
FROM atives a
INNER JOIN rc_bonds b ON b.ativ_id = a.ativ_id
INNER JOIN rc_atives x ON x.ativ_id = a.ativ_id
INNER JOIN rc_group_atives g ON g.grat_id = x.grat_id
AND g.grat_compromisse_sn = 'n';
UPDATE激活一个
设置
流动性=案例
当a.ativ_day_conv‘19000101’
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当b.bond_流动性=-1时
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当日期(部分)(日期),日期(添加)(d)::varchar(1),b.债券(流动性)(int,a.次要)日期
然后日期(部分('day',DATEADD('d'::varchar(1),b.bond\u liquidity::int,a.minor\u DATE)-p\u Dt\u fin)
其他0
结束
从a
b.ativ_id=a.ativ_id上的内部连接rc_键b
x.ativ\u id=a.ativ\u id上的内部联接
g.grat_id=x.grat_id上的内部连接rc_群
g.grat_seu sn='n';
但在PostgreSQL中,所有行的值都是相同的,如何才能正常工作
PS:我刚刚尝试了Gordon的答案(再次感谢!),但我得到的错误如下:
SQL错误[42P01]:错误:对表“a”的FROM子句项的引用无效
提示:表“a”有一个条目,但不能从查询的这一部分引用它
我是如何解决的:
再次感谢你,戈登!你帮了我很多
无法访问JOIN子句上的“a”表,因此我将其替换为“x”(执行相同操作)。我确实可以访问WHERE子句上的“a”表。就在这里
UPDATE actives a
SET
liquidity = CASE
WHEN a.ativ_day_conv <> '19000101'
THEN DATE_PART('day', b.bond_vcto - p_Dt_fin)
WHEN b.bond_liquidity = -1
THEN DATE_PART('day', b.bond_vcto - p_Dt_fin)
WHEN DATE_PART('day', DATEADD('d'::varchar(1), b.bond_liquidity::int, a.minor_date) - p_Dt_fin) > 0
THEN DATE_PART('day', DATEADD('d'::varchar(1), b.bond_liquidity::int, a.minor_date) - p_Dt_fin )
ELSE 0
END
FROM rc_bonds b
INNER JOIN rc_atives x ON x.ativ_id = b.ativ_id
INNER JOIN rc_group_atives g ON g.grat_id = x.grat_id
AND g.grat_compromisse_sn = 'n'
WHERE b.ativ_id = a.ativ_id;
UPDATE激活一个
设置
流动性=案例
当a.ativ_day_conv‘19000101’
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当b.bond_流动性=-1时
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当日期(部分)(日期),日期(添加)(d)::varchar(1),b.债券(流动性)(int,a.次要)日期
然后日期(部分('day',DATEADD('d'::varchar(1),b.bond\u liquidity::int,a.minor\u DATE)-p\u Dt\u fin)
其他0
结束
来自rc_债券b
x.ativ\u id=b.ativ\u id上的内部连接
g.grat_id=x.grat_id上的内部连接rc_群
和g.grat_seu sn='n'
其中b.ativ_id=a.ativ_id;
Postgres中的逻辑不同。两者对update
表的处理方式不同。在Postgres中,它不应该在来自的中重复。因此:
UPDATE激活一个
设置流动性=案例
当a.ativ_day_conv‘19000101’
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当b.bond_流动性=-1时
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当日期(部分)(日期),日期(添加)(d)::varchar(1),b.债券(流动性)(int,a.次要)日期
然后日期(部分('day',DATEADD('d'::varchar(1),b.bond\u liquidity::int,a.minor\u DATE)-p\u Dt\u fin)
其他0
结束
从rc_债券b加入
行动x
关于x.ativ_id=b.ativ_id JOIN
rc_集团公司
关于g.grat_id=x.grat_id和
g、 grat_seu sn='n';
其中b.ativ_id=a.ativ_id
Postgres中的逻辑不同。两者对update
表的处理方式不同。在Postgres中,它不应该在来自
的中重复。因此:
UPDATE激活一个
设置流动性=案例
当a.ativ_day_conv‘19000101’
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当b.bond_流动性=-1时
然后日期部分(“日”,b.bond\vcto-p\U Dt\U fin)
当日期(部分)(日期),日期(添加)(d)::varchar(1),b.债券(流动性)(int,a.次要)日期
然后日期(部分('day',DATEADD('d'::varchar(1),b.bond\u liquidity::int,a.minor\u DATE)-p\u Dt\u fin)
其他0
结束
从rc_债券b加入
行动x
关于x.ativ_id=b.ativ_id JOIN
rc_集团公司
关于g.grat_id=x.grat_id和
g、 grat_seu sn='n';
其中b.ativ_id=a.ativ_id
hq1对不起,就在这里。在我的脚本中,它是正确的:)将您的解决方案添加为答案,而不是对您的问题进行编辑。hq1抱歉,它就在这里。在我的脚本中,它是正确的:)将您的解决方案添加为答案,而不是对您的问题进行编辑。嘿!我刚刚尝试了这个,它的gets:SQL错误[42P01]:错误:对表“a”的FROM子句条目的引用无效提示:表“a”有一个条目,但不能从查询的这一部分引用它。我得到了它。。。无法访问JOIN子句上的“a”表,因此我将其替换为“x”(执行相同操作)。我确实可以访问WHERE子句上的“a”表。@javaMan。只需在FROM
子句中使用b.ativ\u id
。它们是一样的,基于WHERE
。嘿!我刚刚尝试了这个,它的gets:SQL错误[42P01]:错误:对表“a”的FROM子句条目的引用无效提示:表“a”有一个条目,但不能从查询的这一部分引用它。我得到了它。。。无法访问JOIN子句上的“a”表,因此我将其替换为“x”(执行相同操作)。我确实可以访问上的“a”表
UPDATE actives a
SET liquidity = CASE
WHEN a.ativ_day_conv <> '19000101'
THEN DATE_PART('day', b.bond_vcto - p_Dt_fin)
WHEN b.bond_liquidity = -1
THEN DATE_PART('day', b.bond_vcto - p_Dt_fin)
WHEN DATE_PART('day', DATEADD('d'::varchar(1), b.bond_liquidity::int, a.minor_date) - p_Dt_fin) > 0
THEN DATE_PART('day', DATEADD('d'::varchar(1), b.bond_liquidity::int, a.minor_date) - p_Dt_fin )
ELSE 0
END
FROM rc_bonds b JOIN
rc_atives x
ON x.ativ_id = b.ativ_id JOIN
rc_group_atives g
ON g.grat_id = x.grat_id AND
g.grat_compromisse_sn = 'n';
WHERE b.ativ_id = a.ativ_id