JOIN在两列同表(JOIN the same table on two columns)

2019-10-29 23:10发布

我用加入与存储在不同的表实际的国家,商品名称,以取代进口和出口数据的国家和产品ID。 在数据源表( 数据 ),有两列国家的ID,对始发地和目的地,这两个我用国名代替。

我想出的代码是指country_names表两次-作为country_namescountry_names2, -这似乎并不很优雅。 我希望能参考下表只需一次,由一个单一的名字。 如果有人向我指出一个更优雅,也许更有效的方式来达到同样的结果,我将不胜感激。

SELECT
  country_names.name AS origin,
  country_names2.name AS dest,
  product_names.name AS product,
  SUM(data.export_val) AS export_val,
  SUM(data.import_val) AS import_val
FROM
  OEC.year_origin_destination_hs92_6 AS data
JOIN
  OEC.products_hs_92 AS product_names
ON
  data.hs92 = product_names.hs92
JOIN
  OEC.country_names AS country_names
ON
  data.origin = country_names.id_3char
JOIN
  OEC.country_names AS country_names2
ON
  data.dest = country_names2.id_3char
WHERE
  data.year > 2012
  AND data.export_val > 1E8
GROUP BY
  origin,
  dest,
  product

产品编号转换为产品名称的表有6K +行。 这里是一个小例子:

id      hs92    name     
63215   3215    Ink  
2130110 130110  Lac  
21002   1002    Rye  
2100200 100200  Rye  
52706   2706    Tar  
20902   902     Tea  
42203   2203    Beer     
42302   2302    Bran     
178703  8703    Cars

下表对国家的ID转换为国名(这是我必须参加在桌子上两次)有264行对世界上所有的国家。 (id_3char是所使用的列。)下面是一个示例:

id      id_3char    name     
euchi   chi         Channel Islands  
askhm   khm         Cambodia     
eublx   blx         Belgium-Luxembourg   
eublr   blr         Belarus  
eumne   mne         Montenegro   
euhun   hun         Hungary  
asmng   mng         Mongolia     
nabhs   bhs         Bahamas  
afsen   sen         Senegal

这里是从进出口数据表的数据,共205M行有两列起源和我正在参加关于DEST一个示例:

year    origin  dest    hs92    export_val  import_val   
2009    can     isr     300410  2152838.47  3199.24  
1995    chn     jpn     590190  275748.65   554154.24    
2000    deu     gmb     100610  1573508.44  1327.0   
2008    deu     jpn     540822  10000.0     202062.43    
2010    deu     ukr     950390  1626012.04  159423.38    
2006    esp     prt     080530  2470699.19  125291.33    
2006    grc     ind     844859  8667.0      3182.0   
2000    ltu     deu     630399  6018.12     5061.96  
2005    usa     zaf     290219  2126216.52  34561.61     
1997    ven     ecu     281122  155347.73   1010.0

Answer 1:

我想你已经完成它,使得它可以被认为不够好,只是使用的是:O)

同时,如果由于某种原因,你really-really想避免出现两个连接在该国表-你可以做的就是将这种选择下面的语句转换成让我们说'OEC.origin_destination_pairs`表

SELECT 
  o.id_3char o_id_3char,
  o.name o_name,
  d.id_3char d_id_3char,
  d.name d_name
FROM `OEC.country_names` o
CROSS JOIN `OEC.country_names` d   

然后,你可以加入对新表如下

SELECT
  country_names.o_name AS origin,
  country_names.d_name AS dest,
  product_names.name AS product,
  SUM(data.export_val) AS export_val,
  SUM(data.import_val) AS import_val
FROM OEC.year_origin_destination_hs92_6 AS data
JOIN OEC.products_hs_92 AS product_names
   ON data.hs92 = product_names.hs92
JOIN OEC.origin_destination_pairs AS country_names
   ON data.origin = country_names.o_id_3char
  AND data.dest = country_names2.d_id_3char
WHERE data.year > 2012
  AND data.export_val > 1E8
GROUP BY
    origin,
    dest,
    product

上述背后的动机是存储和你的具体情况查询的成本
你`OEC.country_names`表只是在大小10KB
每次查询它的时候你付出,就好像它是10MB(收费四舍五入到最接近的MB,每个查询所引用的表处理最低10点MB的数据,并与每个查询处理的最低10点MB的数据。)

所以,如果你将兑现提到的表上面 - 它仍然会小于10MB所以查询费用没有区别
类似的情况与存储该表 - 在指控没有明显的变化

你可以查看更多关于定价here



文章来源: JOIN the same table on two columns