2014-09-18 2 views
2

У меня есть две таблицы: Table1 и Table2 с одинаковыми столбцами и одинаковой структурой схемы.SQL - Эффективно сравнивать данные всех столбцов из двух таблиц

Теперь я хочу выбрать данные из таблицы 1, которые присутствуют в таблице2. Однако при сравнении данных я хочу сравнить все столбцы, присутствующие в обеих этих таблицах. Например, вся таблица в таблице 1 должна присутствовать в таблице 2. Какой самый быстрый и эффективный способ достичь этого в SQL Server 2008? Обе таблицы содержат около 1000-2000 записей, и эти таблицы будут доступны очень часто.

+0

это s является плохим дизайном базы данных. почему вы хотите сохранить общие данные в обеих таблицах на первом месте. Почему бы не создать представление для него таким образом, что доступ быстрее. В этом случае вам придется делать сравнение с каждой строкой в ​​обеих таблицах. что ты уже испробовал? – vikeng21

+0

@ vikeng21: На самом деле, мне нужно сделать некоторые операции очистки данных, и, следовательно, я создаю таблицу #temp, которая имеет точно такую ​​же схему, что и фактическая таблица. Кроме того, я создал запрос для достижения вышеуказанного требования с использованием внутренних соединений. Моя единственная проблема связана с огромным количеством столбцов, мне нужно применить количество внутренних соединений, которые могут повлиять на производительность. Следовательно, я искал более эффективный способ добиться этого. – AshutoshPujari

+0

, но зачем вам нужна вторая таблица, если вы хотите очистить данные. это для резервной цели, которая звучит для меня. проконсультируйтесь с dba, чтобы узнать, есть ли другой способ. я знаю, что он отклоняется от фактического вопроса, но почему бы не избежать этого, прежде чем идти на сравнение. вы думаете о производительности, и это прекрасно. но я бы настоятельно советовал dba, прежде чем идти дальше – vikeng21

ответ

0

С «существует», то есть решение:

select * from Table1 t1 where exists (select 1 from Table2 t2 
    where t1.col1 = t2.col1 
     and t1.col2 = t2.col2 
     and t1.col3 = t2.col3 
     and ...     // check here all columns ... 
    ) 

Существует, однако, небольшая проблема в этом решении в случае нулевой значения, которые могут быть испытаны только через «IS NOT NULL» или «IS NULL», следовательно, дополнительное решение:

select * from Table1 t1 where exists (select 1 from Table2 t2 
    where (t1.col1 = t2.col1 or (t1.col1 IS NULL and t2.col1 IS NULL)) 
     and (t1.col2 = t2.col2 or (t1.col2 IS NULL and t2.col2 IS NULL)) 
     and (t1.col3 = t2.col3 or (t1.col3 IS NULL and t2.col3 IS NULL)) 
     and ...     // check here all columns ... 
    )