У меня есть три таблицы, мы можем назвать их «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 работала таким образом.