[英]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.