使用第三个映射表

时间:2015-11-19 11:46:41

标签: oracle

我有两个包含3列的表,其中包含等效信息,但适用于不同的环境。两个第一列是等效的,但在两个表上都不同,就像不同语言中的相同单词一样。前两列的每对应该是第三列的唯一标识符。然后我有第三个表来表示两个表之间的等价。

让我用一个例子解释一下。

西班牙语表

Origin| Dest   | Code
mesa  | techo  | AA
mesa  | suelo  | BB
suelo | mesa   | CC
suelo | techo  | DD

英文表

Origin| Dest  | Code
table | floor | XX
table | roof  | YY
floor | table | WW
floor | roof  | ZZ

映射表

Eng   | Spanish
table | mesa
floor | suelo
roof  | techo

然后我要获得的信息是:

AA | XX
BB | YY
CC | WW
DD | ZZ

正如你所看到的,mesa + sobre应该是table + over然后结合特定组合的代码。 我不清楚如何做到这一点。我为了简单起见使用了oracle数据库,但我可以用其他任何方式处理数据,所以欢迎任何建议。

非常感谢

修改 我已经改变了这些例子,因为我刚才意识到它们是坏的。在我的实际情况中,两列属于同一类型,组合应考虑到这一点。

2 个答案:

答案 0 :(得分:1)

您可以使用映射表加入西班牙语和英语表,并获得每个单词的等效内容,然后获取代码:

WITH spanish AS (SELECT 'mesa' origin, 'techo' dest, 'AA' code FROM DUAL
                 UNION
                 SELECT 'mesa' origin, 'suelo' dest, 'BB' code FROM DUAL
                 UNION
                 SELECT 'suelo' origin, 'mesa' dest, 'CC' code FROM DUAL
                 UNION
                 SELECT 'suelo' origin, 'techo' dest, 'DD' code FROM DUAL),
english AS (SELECT 'table' origin, 'floor' dest, 'XX' code FROM DUAL
                 UNION
                 SELECT 'table' origin, 'roof' dest, 'YY' code FROM DUAL
                 UNION
                 SELECT 'floor' origin, 'table' dest, 'WW' code FROM DUAL
                 UNION
                 SELECT 'floor' origin, 'roof' dest, 'ZZ' code FROM DUAL),
map AS (SELECT 'table' english, 'mesa' spanish FROM DUAL
        UNION
        SELECT 'floor' english, 'suelo' spanish FROM DUAL 
        UNION
        SELECT 'roof' english, 'techo' spanish FROM DUAL)
SELECT spanish.origin, spanish.dest, english.origin, spanish.code, english.code
FROM spanish, english, map map1, map map2
WHERE spanish.origin = map1.spanish
AND spanish.dest = map2.spanish
AND english.origin = map1.english
AND english.dest = map2.english

请注意,我稍微更改了映射表。西班牙语专栏中有一些英文单词。另外,我认为你说的结果是错的。这就是我得到的:

DD ZZ
CC WW
BB XX
AA YY

编辑:我这样做的好习惯就像我之前做的那样。使用正确的语法,查询将是:

WITH (.....)
SELECT spanish.origin, spanish.dest, english.origin, spanish.code, english.code
FROM spanish JOIN map map1 ON spanish.origin = map1.spanish 
             JOIN map map2 ON spanish.dest = map2.spanish 
             JOIN english ON map1.english = english.origin AND map2.english = english.dest

答案 1 :(得分:0)

地点和副词的双重映射可以按如下方式实现:

    select e.Code, s.Code
      from spaTable        s
inner join mapTableSpanish mts on s.Place = mts.Spanish
inner join engTable        e   on e.Place = mts.Eng
     where exists (
               select 1
                 from mapTableSpanish mts_sq
                where e.Adverb = mts_sq.Eng
                  and s.Adverb = mts_sq.Spanish
           )
         ;

替代方法:

    select e.Code, s.Code
      from spaTable        s
inner join mapTableSpanish mts_p on s.Place  = mts_p.Spanish
inner join mapTableSpanish mts_a on s.Adverb = mts_a.Spanish
inner join engTable        e     on ( 
                                           e.Place  = mts_p.Eng
                                       AND e.Adverb = mts_a.Eng
                                    )
         ;

注意

在这里讨论@ MarcusH的表名(但他的解决方案是错误的)。