繁体   English   中英

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

[英]PostgreSQL - Update with JOIN - inner or outer?

我来自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,则无法通过这种条件将其评估为true,对吗?

(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);

在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 
\n c |  C \n :-|  : - \n

db <> 在这里拨弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM