2017-02-17 9 views
2

2つのテーブルがあります。1つのテーブルのすべてのレコードを選択し、そのレコードが別のテーブルにあるかどうかを示すフィールドを追加します。

ユーザー:

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 

私は次のような結果が必要ですCUSTOMIDが一覧表にありますならば、私は識別子が追加必要

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

をユーザーテーブル。

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

しかし、同じCUSTOMIDと一覧表内の複数のレコードがあるので、私は重複の多くを取得しています:ここで私はこれまで試したものです。

答えて

1

あなたはCASEを使用することができますし、私はあなたが重複していないので、あなたは両方のテーブルのcustomIDのグループはず、BY文GROUP_を使用することができると思う

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

をEXISTS。 select文(属性customIDの前)でキーワードDISTINCTを使用することもできますが、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

ありがとうございました。それは動作しますが、クエリを実行するのにかなり時間がかかります。 –

関連する問題