2017-09-04 94 views
0

我有两个表。CONCAT值在JOIN的ON条件下

表:国地名

  • 国家(2字符ISO代码,例如SE)
  • AdminArea(CHAR代码,例如0330)

表AdminAreas

  • AdminCode,(Combin Coutry和AdminArea,例如“SE.0330”)

因此,我想要加入表的AdminAreas的ID是第一个表上的列的组合。要加入它,我需要加入Geonames表中的两个值。就像是。

SELECT 
geoname.geonameid, geoname.name, geoname.latitude, geoname.longitude, 
geoname.country, geoname.admin1, admin_one.admin_id, admin_one.geoname_id 
FROM geoname 
INNER JOIN admin_one ON admin_one.admin_id = CONCAT(geoname.country, '.', geoname.admin1) 
WHERE country='SE' LIMIT 10 

不幸的是,这是行不通的。这似乎不是我可以CONCAT或做一个JOIN string_agg()。我如何获得这个JOIN的工作?

+0

似乎是糟糕的桌子设计......在任何地方以相同的方式存储数据。 – jarlh

+0

@jarlh我从现有的来源导入数据。这不是我的桌子设计。 –

回答

0

你的代码没问题。也许有一个问题是你有空间或其他角色。我会推荐这使用调查:

SELECT gn.geonameid, gn.name, gn.latitude, gn.longitude, 
     gn.country, gn.admin1, ao.admin_id, ao.geoname_id 
FROM geoname gn LEFT JOIN 
    admin_one ao 
    ON ao.admin_id = CONCAT(TRIM(gn.country), '.', TRIM(gn.admin1)) 
WHERE gn.country = 'SE' 
LIMIT 10; 

这将返回甚至无法比拟的结果(因为LEFT JOIN)。这可能有助于您调查问题。

+0

不是很有效率..索引将被忽略,更好的重新设计。 – sagi

+0

似乎你是对的,TRIM()帮助它。我只是做了很多geoname数据的导入,这些数据结构不好,所以我不在乎“很好地”这样做,它只是假设运行一次。谢谢。 –