2015-11-19 3 views
0

У меня есть две таблицы с 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 

Mapping стол

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

Затем информация, которую я хочу, чтобы это:

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

Как вы можете видеть, mesa + sobre следует преобразовывать в таблицу +, а затем комбинировать код этой конкретной комбинации. Я понятия не имею, как это сделать. Я использую базу данных oracle для простоты, но я могу обрабатывать данные любым другим способом, поэтому любое предложение приветствуется.

Большое спасибо

EDIT: Я изменил примеры, потому что я просто понял, что они плохие. В моем реальном случае два столбца одного типа, и комбинация должна учитывать это.

+0

Вам необходимо указать соответствие между наречиями (возможно, включив его в существующую таблицу отображения) - в противном случае, как следует дб знать о переписке между «над» /» sobre 'вместо' over '/' debajo '? – collapsar

+0

Дорогой @collapsar, вы правы. Я забыл добавить отображение.Все карты находятся в одной таблице, потому что в реальном случае все имеют один и тот же тип. – Danielo515

ответ

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 

EDIT: Это плохая привычка моя делает стыки, как я делал раньше. Используя правильный синтаксис запроса будет:

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 
+0

Помимо первой части сценария, которую я не понял в первом чтении (теперь я это делаю), это самое простое решение, на мой взгляд. Я сделал несколько тестов, и результаты кажутся правильными. Если вы не возражаете, pablomatico, не могли бы вы объяснить мне, почему вы используете множественный выбор вместо соединения? – Danielo515

+0

На самом деле это ПРИСОЕДИНЯЙТЕСЬ. Извини за это. Это неправильный способ сделать это и плохую привычку, от которой я пытаюсь избавиться. Испанская таблица соединена с map1 и map2 через 'spanish.origin = map1.spanish' и' spanish.dest = map2.spanish'; и английскую таблицу. Я сейчас не на своем компьютере и не могу переписать запрос, но я сделаю это, как только смогу ... – pablomatico

+0

Здравствуйте, @pablomatico, благодарю вас за разъяснение. На самом деле ваше решение работает, что меня немного смущает. Итак, правильный ответ будет выглядеть так, как предложенный @collapsar? С уважением – Danielo515

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 здесь (его решение, однако, неверно).

Смежные вопросы