首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用第三个映射表将两个表按两列连接起来

使用第三个映射表将两个表按两列连接起来
EN

Stack Overflow用户
提问于 2015-11-19 11:46:41
回答 2查看 1K关注 0票数 0

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

让我举个例子来解释一下。

西班牙桌

代码语言:javascript
运行
复制
Origin| Dest   | Code
mesa  | techo  | AA
mesa  | suelo  | BB
suelo | mesa   | CC
suelo | techo  | DD

英文版

代码语言:javascript
运行
复制
Origin| Dest  | Code
table | floor | XX
table | roof  | YY
floor | table | WW
floor | roof  | ZZ

映射表

代码语言:javascript
运行
复制
Eng   | Spanish
table | mesa
floor | suelo
roof  | techo

我想得到的信息是:

代码语言:javascript
运行
复制
AA | XX
BB | YY
CC | WW
DD | ZZ

正如您所看到的,mesa+sobre应该是table+over的工具,然后组合该特定组合的代码。我不知道该怎么做。为了简单起见,我使用了oracle数据库,但我可以以任何其他方式处理数据,因此任何建议都是受欢迎的。

非常感谢

编辑:我更改了示例,因为我刚刚意识到它们是坏的。在我的实际例子中,这两列是相同类型的,组合应该考虑到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-19 12:16:09

您可以将西班牙语和英语表与映射表连接起来,获取每个单词的等效值,然后得到代码:

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
DD ZZ
CC WW
BB XX
AA YY

编辑:这是我和以前一样做连接的坏习惯。使用正确的语法,查询如下:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-11-19 12:05:43

对地点和副词的双重映射可执行如下:

代码语言:javascript
运行
复制
    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
           )
         ;

替代方法:

代码语言:javascript
运行
复制
    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
                                    )
         ;

Note

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33803050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档