2014-10-27 2 views
0

У нас есть 2 таблицы с английскими словами: words_1 и words_2 с полями (слово как VARCHAR, ref как INT), где слово - это английское слово, ref - ссылка на другую (третью) таблицу (это не важно).Большое внутреннее соединение

В каждой таблице все слова уникальны. Первая таблица содержит несколько слов, которые не входят во вторую (и, наоборот, вторая таблица содержит некоторые уникальные слова).

Но большинство слов в двух таблицах одинаковы.

Необходимо получить: Таблица результатов со всеми отдельными словами и ref.

Начальные условия

  1. Ref для тех же таблиц могут быть разными (словари были загружены из разных мест). рассчитывать
  2. слова 300 000 в каждой таблице, так что внутреннее соединение не удобно

Примеры

words_1 
________ 
Health-1 
Car-3 
Speed-5 

words_2 
_________ 
Health-2 
Buty-6 
Fast-8 
Speed-9 

Result table 
_____________ 
Health-1 
Car-3 
Speed-5 
Buty-6 
Fast-8 
+0

В вашем результате не отображаются слова «все отличные слова и ссылки». Он показывает все отдельные слова с одним ref (по умолчанию - словами_1.ref или по меньшей мере (words_1.ref, words_2.ref) в случае двусмысленности - неясно, какой). –

ответ

0

Попробуйте использовать full outer join:

select coalesce(w1.word, w2.word) as word, coalesce(w1.ref, w2.ref) as ref 
from words_1 w1 full outer join 
    words_2 w2 
    on w1.word = w2.word; 

Единственный раз, когда это будет не работает, если ref может быть NULL в любой таблице. В этом случае измените on на:

on w1.word = w2.word and w1.ref is not null and w2.ref is not null 

Если вы хотите улучшить производительность, просто создать индекс по таблицам:

create index idx_words1_word_ref on words_1(word, ref); 
create index idx_words2_word_ref on words_2(word, ref); 

join вполне выполнимо и даже без индекса, SQL Сервер должен быть достаточно умным, чтобы придумать разумную реализацию.

1
select word,min(ref) 
from (
    select word,ref 
    from words_1 
    union all 
    select word,ref 
    from words_2 
    ) t 
group by word 
Смежные вопросы