PostgreSQL-使用JOIN更新-内部还是外部?

时间:2019-02-06 17:45:04

标签: sql postgresql join sql-update

我来自SQL Server,正在将一些T-SQL代码迁移到Postgres。

在PostgreSQL中,我现在有了这个UPDATE语句(见下文)。

其中:
"#reportdata"是一个临时表
kwt.Report是普通表

WHERE子句中的这一部分正在执行隐式JOIN。我认为这就是他们在Postgres中的称呼。

(cr.campaignid = rp.campaignid AND cr.reportdate = rp.reportdate)

这是因为这对夫妇(campaignid,reportdate)表示kwt.Report中的唯一逻辑键。同样,两个列在kwt.Report中都不为空。 在“ #reportdata”中,两列都可以为NULL。

我的问题是:当我在UPDATE语句中看到这样的隐式联接时,我总是不知道它是INNER还是OUTER联接。我认为是INNER,这不可能是OUTER,但我只是想确定。

有人可以确认吗?

我的意思是,好的,如果rp.campaignid为NULL,则无法通过这种条件求出对,对吧?

(cr.campaignid = rp.campaignid AND cr.reportdate = rp.reportdate)

我问这个问题,是因为我不确定与NULL的比较在Postgres中的工作方式是否与SQL Server中的工作方式相同。据我所记得,在SQL Server NULL = a中,总评估结​​果为NULL(不是真(位0),不是假(位1)而是NULL)。如果这种理解不正确,请纠正我。在Postgres中也一样吗?

UPDATE kwt.Report cr 
SET 
    impressions = rp.impressions,
    clicks = rp.clicks,
    views = rp.views 
FROM 
    "#reportdata" AS rp
WHERE
    (cr.campaignid = rp.campaignid AND cr.reportdate = rp.reportdate)
    AND (rp.campaignid IS NOT NULL);

1 个答案:

答案 0 :(得分:1)

在SQL中:

A = null既不是true也不是false

检查此

with cte0 as 
(
   select '1' as c 
), cte1 as
(
   select null  as c
)
select * from cte0 
   inner join cte1 on cte0.c = cte1.c
union
select * from cte0 
   inner join cte1 on cte0.c != cte1.c
c  | c 
:- | :-

db <>提琴here