выбор несовпадающих записей из полного внешнего объединения

269
user

У меня две таблицы

tb1  ------- 1,ali 2,ana 3,kim 6,git 8,sen 9,pam  tb2 ------- 2,joy 3,fin 4,roy 5,dina 9,tim  output ------- 1,ali 2,joy 3,fin 4,roy 5,dina 6,git 8,sen 9,tim 

Мне нужно объединить две таблицы и для общих столбцов я должен рассмотреть идентификатор и имя из tb2, иначе это из tb1. наряду с этим мне нужны несоответствующие записи из обеих таблиц моего запроса:

select case when tb1.id=tb2.id then tb2.id else tb1.id end as id, case when tb1.id=tb2.id then tb2.name else tb1.name end as name  from tb1 full outer join tb2 on tb1.id=tb2.id; 

это не дает мне несоответствующие записи. Как я могу добиться этого без добавления нескольких проверок на ноль?

1
Я предполагаю, что вы используете SQL Server, так как вы используете `FULL OUTER JOIN`, правильно? Вместо того, чтобы использовать `JOIN`, вы играли с` UNION` any, чтобы объединить оба результата и затем вместо этого выбрать из него в качестве подзапроса? Просто быстрая идея без тестирования, но я размещаю все свои вопросы по SQL-запросу на https://stackoverflow.com, а не здесь. Также рассмотрите возможность размещения некоторых данных на http://sqlfiddle.com, если у вас есть возможность, и разместите на них ссылку на свой вопрос. Pimp Juice IT 5 лет назад 1

1 ответ на вопрос

0
Mureinik

Использование for full outer joinвыглядит корректно, но выбранные термины не будут правильно обрабатывать пропущенные элементы. Использование coalesceдолжно сделать трюк:

SELECT COALESCE (tb2.id, tb1.id) AS id, COALESCE (tb2.name, tb1.name) AS name FROM tb1 FULL OUTER JOIN tb2 ON tb1.id = tb2.id; 
да, что произойдет, если идентификаторы совпадают, но tb2.name имеет значение null, а tb1.name имеет какое-то значение? это все еще рассмотрит tb1.name? user 5 лет назад 0
@user, да, это то, для чего нужен вызов coalesce. Mureinik 5 лет назад 0
хм, но я хочу забрать записи из tb2 для всех столбцов, если id совпадает между двумя, поэтому я использовал row_number, который работал user 5 лет назад 0