PostgreSQL - обновление с помощью JOIN - внутреннее или внешнее? - PullRequest
0 голосов
/ 06 февраля 2019

Я пришел с 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 объединением.Я думаю, что это ВНУТРЕННЕЕ, нет никакого способа быть ВНЕШНИМ, но я просто хочу быть уверен.

Может кто-нибудь подтвердить, пожалуйста?

Я имею в виду, хорошо, если rp.campaignid НЕДЕЙСТВИТЕЛЕН, нетКак это условие оценить как истинное, верно?

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

Я спрашиваю об этом, потому что я не уверен, что сравнение с NULL работает в Postgres так же, как в SQL Server.Насколько я помню, в SQL Server NULL = a всегда оценивается как NULL (не в true (бит 0), не в false (бит 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 голосов
/ 06 февраля 2019

В 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 
:- | :-

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...