2016-12-19 7 views
1

У меня есть следующие table1, в котором id может появиться несколько раз, и каждый раз с уникальным name и то же самое для name, она может появиться несколько раз и каждый раз с другим id.SQL объединить две таблицы и получить уникальные значения из одной таблицы на основе другой

id name 
--------- 
A2 B6 
A3 B2 
A3 B400 
A5 B100 
A7 B200 
A8 B300 
A8 B2 
A8 B3 

и вот table2, в котором все id с от table1 существуют, но не все name с. И каждый id имеет surname.

id name surname 
------------------- 
A1   Lastname1 
A2   Lastname2 
A3 B1  Lastname3 
A4   Lastname4 
A5 B2  Lastname5 
A6   Lastname6 
A7 B3  Lastname7 
A8 B4  Lastname8 
A9   Lastname9 
A10 B6  Lastname10 

вот результат запроса: - первый столбец: список всех уникальных id с от table1 PLUS список всех name с в table1, которые не найдены в name колонка таблица2. - вторая колонка: surname из каждого элемента в id столбце таблицы результатов, взятой из table2, всех id с от table1 имеет соответствующую фамилию, но если name от table1 не был найден в table2, тогда мы помещаем то же самое name как фамилия. - третья колонка: если id или name из table1 был найден в table2, то статус будет НАЙДЕНО, однако если name от table1 не был найден, он получит НЕ НАЙДЕНО

id  surname  status 
--------------------------- 
A2  Lastname2 FOUND 
A3  Lastname3 FOUND 
A5  Lastname5 FOUND 
A7  Lastname7 FOUND 
A8  Lastname8 FOUND 
A10  Lastname10 FOUND 
B100 B100  NOT FOUND 
B200 B200  NOT FOUND 
B300 B300  NOT FOUND 
B400 B400  NOT FOUND 
+0

вы можете использовать 'влево join' – Rahul

+0

Эта строка не имеет смысла - 'A2 Lastname2 FOUND' - каковы правила« разрешить »это одно из них? – Hogan

+0

Это немного запутанно. Вы можете начать, избегая использования дескриптора столбца 'id'. Большинство из нас думали бы о 'id' как уникальном и' AUTO_INCREMENT'. Затем дайте таблицам описательные имена о том, что они представляют вместо «table1» «table2». Даже использование имени в качестве имени может быть немного запутанным. – ebyrob

ответ

0

Это называется левым соединением. Вот как применить его к вашему вопросу:

SELECT table1.id, coalesce(table2.surname, table1.name) as surname, 
     case when table2.id is null then 'not found' else 'found' end as status 
FROM table1 
LEFT JOIN table2 on table1.id = table2.id and table1.name = table2.name 

Как @ebyrob отметил, вы не хотите, идентификаторы в первой колонке для не совпадений:

SELECT 
    case when table2.id is null then table1.name else table1.id end as id, 
    coalesce(table2.surname, table1.name) as surname, 
    case when table2.id is null then 'not found' else 'found' end as status 
FROM table1 
LEFT JOIN table2 on table1.id = table2.id and table1.name = table2.name 
+0

Для начала OP совпадает с 'table1.name' против' table2.id', вещи отступают оттуда. – ebyrob

+0

Не знаю, что вы имеете в виду @ebyrob - это не то, что показано в вопросе. Иды начинаются с «A», а имена начинаются с «B», поэтому такое совпадение невозможно. – Hogan

+0

Прочтите описание желаемого результата. Первый столбец - это список всех имен и идентификаторов из первой таблицы.Позже: «если идентификатор или имя из таблицы1 был найден в таблице2», затем FOUND и т. Д. – ebyrob

Смежные вопросы