Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
如何在PostgreSQL中使用join更新多行_Sql_Sql Server_Postgresql - Fatal编程技术网

如何在PostgreSQL中使用join更新多行

如何在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

我在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, @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