Sqlite3离开了连接并且导致了额外的否定

时间:2017-11-06 15:38:13

标签: sql join sqlite left-join

我有两张桌子:

sqlite> select * from gender_age_brand_train limit 10;
index       Unnamed: 0  device_id             gender      age         group       phone_brand
----------  ----------  --------------------  ----------  ----------  ----------  -----------
1           0           -8076087639492063270  M           35          M32-38      小米         
2           1           -2897161552818060146  M           35          M32-38      小米         
3           2           -8260683887967679142  M           35          M32-38      小米         
4           3           -4938849341048082022  M           30          M29-31      小米         
5           4           245133531816851882    M           30          M29-31      小米         
6           5           -1297074871525174196  F           24          F24-26      OPPO       
7           6           236877999787307864    M           36          M32-38      酷派         
8           7           -8098239495777311881  M           38          M32-38      小米         
9           8           176515041953473526    M           33          M32-38      vivo       
10          9           1596610250680140042   F           36          F33-42      三星       

第二张表:

sqlite> select * from phone_brand_latin_new limit 10;
index       chinese     latin_brands
----------  ----------  ------------
1           三星          samsung     
2           天语          Ktouch      
3           海信          hisense     
4           联想          lenovo      
5           欧比          obi         
6           爱派尔         ipair       
7           努比亚         nubia       
8           优米          youmi       
9           朵唯          dowe        
10          黑米          heymi   

我写了以下查询:

sqlite> SELECT * FROM gender_age_brand_trai LEFT JOIN phone_brand_latin_new WHERE phone_brand = chinese limit 20;

使用以下输出:

sqlite> SELECT * FROM gender_age_brand_trai LEFT JOIN phone_brand_latin_new WHERE phone_brand = chinese limit 10;
index       Unnamed: 0  device_id             gender      age         group       phone_brand  index       chinese     latin_brands
----------  ----------  --------------------  ----------  ----------  ----------  -----------  ----------  ----------  ------------
1           0           -8076087639492063270  M           35          M32-38      小米           59          小米          xiaomi      
2           1           -2897161552818060146  M           35          M32-38      小米           59          小米          xiaomi      
3           2           -8260683887967679142  M           35          M32-38      小米           59          小米          xiaomi      
4           3           -4938849341048082022  M           30          M29-31      小米           59          小米          xiaomi      
5           4           245133531816851882    M           30          M29-31      小米           59          小米          xiaomi      
7           6           236877999787307864    M           36          M32-38      酷派           57          酷派          coolpad     
8           7           -8098239495777311881  M           38          M32-38      小米           59          小米          xiaomi      
10          9           1596610250680140042   F           36          F33-42      三星           1           三星          samsung     
11          10          9032155484127182494   M           31          M29-31      华为           55          华为          huawei      
12          11          7477216237379271436   F           37          F33-42      华为           55          华为          huawei  

此查询淡出了OPPO等非中国品牌。我想在一个专栏中列出所有非中国品牌。仅针对非中国品牌的信息位于gender_age_brand_train.phone_brandsphone_brand_latin_new.latin_brands。在这种情况下我该怎么做?

2 个答案:

答案 0 :(得分:2)

left joinon子句和case一起使用,如下所示:

SELECT
    *,
    case
    when chinese is not null
    then phone_brand
    else null
    end as phone_brand_chinese_match,
    case
    when chinese is null
    then phone_brand
    else null
    end as phone_brand_chinese_only
FROM
    gender_age_brand_trai
    LEFT JOIN phone_brand_latin_new on
         phone_brand = chinese 

答案 1 :(得分:0)

在这种情况下,我的解决方案基于@Indent

的方法
sqlite> SELECT
   ...>     latin_brands,
   ...>     case
   ...>     WHEN chinese is not null
   ...>     then phone_brand
   ...>     else phone_brand
   ...>     end as phone_brand_chinese_match,
   ...>     case 
   ...>     WHEN chinese is not null
   ...>     then latin_brands
   ...>     else phone_brand
   ...>     end as only_latin_brands
   ...> FROM
   ...>     gender_age_brand_trai
   ...> LEFT JOIN phone_brand_latin_new on
   ...>      phone_brand = chinese limit 10;

latin_brands  phone_brand_chinese_match  only_latin_brands
------------  -------------------------  -----------------
xiaomi        小米                         xiaomi           
xiaomi        小米                         xiaomi           
xiaomi        小米                         xiaomi           
xiaomi        小米                         xiaomi           
xiaomi        小米                         xiaomi           
              OPPO                         OPPO             
coolpad       酷派                         coolpad          
xiaomi        小米                         xiaomi           
              vivo                         vivo             
samsung       三星                         samsung          
sqlite>