UNION和NOT EXISTS抛出错误

时间:2017-09-20 13:10:02

标签: sql oracle union

我有一个表格,其中包含英文和法文名称的城市名称,只要名称不同,否则它只有英文名称。 注意。城市CityA和CityA`的地理编码将相同,因为两者都是同一个城市,但代码会有所不同。

表名=城市

列位于

之下
city,code,language,geocode

EG。

cityA  Frc
cityA  Frc
cityB  Eng
CityC  Eng
CityD  Eng
CityD` FRC

所以我们可以从上面的例子中看到,CityA既有法语也有英文名字,而CityB没有,因为CityB的法语和英语都有相同的拼写/重音。

我想要做的是基于用户语言,如果用户语言是法语,则返回所有法语名称加上没有法语口音的英文名称。 所以从上面它应该返回CityA`,CityB,CityC,CityD'

同样如果用户语言是英语返回所有英文名称。 CityA,CityB,CityC.CityD。

以下是我试过的内容

select a.city,a.code from country a
where a.language=userenv('lang') -- it will be either french or english 
union
select b.city,b.code from country b
where b.language='Eng' 
AND not exists( select geocode from country 
            where geocode = a.geocode)

我收到错误,因为a.geocode未识别。

2 个答案:

答案 0 :(得分:2)

您需要使表别名正确。

我建议:

select c.city, c.code
from country c
where c.language = userenv('lang') -- it will be either french or english 
union all
select c2.city, c2.code
from country c2
where c2.language = 'Eng' and
      not exists (select 1
                  from country c3
                  where c3.geocode = c2.geocode
                 );

在您的查询中,子查询中不知道a的别名。但是,表别名应该是表名的缩写,而不是任意字母。

那就是说,我认为你真正想要的问题是:

select c.city, c.code
from country c
where c.language = userenv('lang') -- it will be either french or english 
union all
select c2.city, c2.code
from country c2
where c2.language = 'Eng' and
      not exists (select 1
                  from country c3
                  where c3.geocode = c2.geocode and
                        c3.language = userenv('lang')
                 );

答案 1 :(得分:1)

自我full outer join,一个用于userenv('lang')的表实例和一个用于英语的表实例:

select coalesce(c1.city, c2.city), coalesce(c1.code, c2.code)
from country c1
full outer join country c2
   on  c1.code = c2.code 
   and c1.language = userenv('lang')
   and c2.language = 'Eng'

使用COALESCE()选择userenv('lang')值(如果可用),否则选择英文值。