Полное внешнее соединение трех таблиц - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть три таблицы, мы можем назвать их «t1», «t2» и «t3», к которым мне нужно присоединиться. Я хочу сопоставить их по двум атрибутам, давайте назовем их «Attr1» и «Attr2» и сохраню все кортежи во всех трех таблицах, совпадают они или нет. Во всех таблицах есть кортежи, которые не совпадают в других (большинство), и есть несколько кортежей, которые имеют совпадение в одной или другой из других таблиц, и есть меньшинство (около 1% всех кортежей во всех три таблицы) из кортежей, которые имеют совпадение в каждой таблице.

Я попробовал решение ниже:

select Attr1 = case 
when a.Attr1 is null and b.Attr1 is null then c.Attr1
when a.Attr1 is null and c.Attr1 is null then b.Attr1
when c.Attr1 is null and b.Attr1 is null then a.Attr1
when a.Attr1 is null and b.Attr1 is not null and c.Attr1 is not null then c.Attr1
when c.Attr1 is null and b.Attr1 is not null and a.Attr1 is not null then b.Attr1
when b.Attr1 is null and b.Attr1 is not null and c.Attr1 is not null then a.Attr1
else a.Attr1
end, Attr2 = /*Same principle for Attr2 as used for Attr1*/, other variables
from t1 a
full outer join t2 b on a.Attr1 = b.Attr1 and a.Attr2 = b.Attr2
full outer join t3 c on (a.Attr1 = c.Attr1 and a.Attr2 = c.Attr2) and (b.Attr1 = c.Attr1 and b.Attr2 = c.Attr2)

Сценарий выполняется без ошибок, но последнее соединение не работает. Кажется, провал на матче между t3 и t2. Он работает на совпадение между t3 и t1.

Я также попробовал решение "isnull", предложенное Сержем на Multiple FULL OUTER JOIN для нескольких таблиц , но я не смог получить это работа эзер. Там, я думаю, я не знал, как правильно использовать несколько атрибутов для объединения.

Одно из решений, о котором я подумал, - это разделить объединение на две части, чтобы я получил полное внешнее объединение между двумя таблицами. в течение одного полного внешнего соединения. Но я действительно хочу избежать этого, если возможно, потому что сценарий намного больше, чем показано здесь. И у меня возникают трудности, чтобы логика c работала таким образом.

1 Ответ

0 голосов
/ 26 февраля 2020

И вдруг я понял, что есть один способ с решением «isnull», который я не пробовал, который, кажется, работает:

from t1 a
full outer join t2 b on a.attr1 = b.attr1 and a.attr2 = b.attr2
full outer join t3 c on isnull(a.attr1,b.attr1) = c.attr1 and isnull(a.attr2,b.attr2) = c.attr2

Но, так как я впервые используя функцию «isnull» таким образом (в соединении), я был бы очень признателен за комментарии, если они могут создавать ошибки, которые трудно найти в больших структурах данных / наборах данных. Я только попробовал на маленьком образце теперь, где это выглядит, как будто это работает. Но я не смогу проверить результаты во всех аспектах, когда запустил его на большом наборе данных. :)

...