我来自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);
答案 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