2017-02-17 2 views
2

У меня есть 2 таблицы.Выберите все записи из одной таблицы с дополнительным полем, которое показывает, была ли эта запись найдена в другой таблице

пользователей:

ID  CUSTOMID  NAME 
1  X543   John 
2  X354   Jane 
3  X389   Jack 
4  X123   James 

список:

ID  CUSTOMID  NAME  ADDRESS 
1  X543   John  address1 
2  X543   John  address2 
3  X543   John  address3 
4  X543   John  address4 
5  X543   John  address5 
6  X354   Jane  address1 
7  X354   Jane  address2 
8  X354   Jane  address3 
9  X389   Jack  address1 
10  X389   Jack  address2 
11  X389   Jack  address3 
12  X389   Jack  address4 
13  X389   Jack  address5 
14  X389   Jack  address6 

мне нужен следующий результат:

ID  CUSTOMID  NAME  MATCHED 
1  X543   John  1 
2  X354   Jane  1 
3  X389   Jack  1 
4  X123   James 0 

Если есть CUSTOMID в таблице списка, то мне нужно идентификатор добавляется к таблица пользователей. Вот что я пытался до сих пор:

SELECT users.*, if(list.CUSTOMID IS NULL, FALSE, TRUE) AS matched from users LEFT JOIN list ON (users.CUSTOMID=list.CUSTOMID) 

Но я получаю много дублей, так как есть несколько записей в таблице списка с той же CUSTOMID.

ответ

1

Вы можете использовать СЛУЧАЙ и EXISTS

Select u.*, 
    case when exists (
    select 1 from list l where u.customid =l.customid 
) then 1 else 0 end matched 
From users u; 
+0

работал отлично! Благодаря! –

-1

Я думаю, что вы можете использовать GROUP_ BY заявление, так что вы не имеете дубликаты, вы должны группа для customID в обеих таблицах. Однако вы также можете использовать ключевое слово DISTINCT в инструкции select (до атрибута customID), DISTINCT менее эффективен, чем GROUP_BY.

1

очень незначительно Изменение существующего запроса ...

SELECT DISTINCT u.* 
       , COALESCE(l.CUSTOMID IS NOT NULL,0) matched 
      FROM users u 
      LEFT 
      JOIN list l 
      ON l.CUSTOMID = u.CUSTOMID 
+0

Благодарим за изменение. Он работает, но требуется намного больше времени для выполнения запроса. –

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