我有两个表,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数据库,但我可以以任何其他方式处理数据,因此任何建议都是受欢迎的。
非常感谢
编辑:我更改了示例,因为我刚刚意识到它们是坏的。在我的实际例子中,这两列是相同类型的,组合应该考虑到这一点。
发布于 2015-11-19 12:16:09
您可以将西班牙语和英语表与映射表连接起来,获取每个单词的等效值,然后得到代码:
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发布于 2015-11-19 12:05:43
对地点和副词的双重映射可执行如下:
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
)
;Note
在这里讨论@MarcusH的表名(然而,他的解决方案是错误的)。
https://stackoverflow.com/questions/33803050
复制相似问题