2009-09-11 2 views
3

Я хотел бы знать, как сравнить две разные базы данных таблицы записей. Я имею в виду, что я сравню две таблицы базы данных, которые могут иметь разные имена столбцов, но те же данные. Но у одного из них может быть больше записей, чем у другого, поэтому я хочу посмотреть, какая разница между этими двумя таблицами. Чтобы сделать это, как написать запрос sql? FYI: эти две базы данных находятся под одним и тем же экземпляром SQL Server.Сравнение запросов для сравнения двух таблиц SQL Server

Table1 
------+--------- 
|name |lastname| 
------+--------- 
|John |rose | 
------+--------- 
|Demy |Sanches | 
------+--------- 

Table2 
------+---------- 
|name2|lastname2| 
------+---------- 
|John |rose  | 
------+---------- 
|Demy |Sanches | 
------+---------- 
|Ruby |Core  | 
------+---------- 

Затем, когда после сравнения таблицы 1 и таблицы 2, он должен вернуть Рубин Сердечник из Table2.

+1

Просто попробуйте уточнить свой вопрос. Что из следующего вам интересно? 1. Разница имен столбцов между таблицами, где данные столбца семантически одинаковы? 2. Строки, которые находятся в одном столе, но не в другом? 3. Строки, которые похожи, но могут отличаться на X количество столбцов? 4. У какой таблицы больше записей? – Scanningcrew

+0

Хорошо, я редактировал вопрос. – Tarik

ответ

6

Если вы выполняете внешнее соединение от T1 до T2, вы можете найти строки в первом, которые не находятся в последнем, ища нули в значениях T2, аналогично внешнее соединение T2-T1 даст вам строки в T2. Союз двух вместе, и вы получите много ... что-то вроде:

SELECT 'Table1' AS TableName, name, lastname FROM 
    Table1 OUTER JOIN Table2 ON Table1.name = Table2.name2 
          AND Table1.lastname = Table2.lastname 
WHERE Table2.name2 IS NULL 
UNION 
SELECT 'Table2' AS TableName, name2 as name, lastname2 as lastname FROM 
    Table2 OUTER JOIN Table1 ON Table2.name2 = Table1.name 
          AND Table2.lastname2 = Table1.lastname 
WHERE Table1.name IS NULL 

Это у верхней части моей головы, - и я немного ржавый :)

+0

Позвольте мне попробовать ваш метод. Благодарю. – Tarik

-1

Firefly будет делать именно то, что вы» ищу. Он позволяет создавать два SQL-оператора, а затем сравнивать результаты запросов sql, отображающих недостающие строки и различия данных. Каждый запрос может даже поступать из другой базы данных, такой как сервер oracle/sql.

http://download.cnet.com/Firefly-Data-Compare-Tool/3000-10254_4-10633690.html?tag=mncol

+0

Спасибо, но на самом деле я не ищу программное обеспечение, которое может делать то, что я хочу. Я хочу реализовать его сам. Благодарю. – Tarik

+0

Ссылка уже мертва. –

0

Попробуйте dbForge Data Compare for SQL Server. Он может сравнивать и синхронизировать любые данные базы данных. Быстро, легко, всегда доставляя правильный результат. Посмотрите, как он летает в вашей базе данных!

2

Если вы используете сервер Sql, используйте полное соединение. он делает то же самое, что сказал Мерф, но в одной команде.

SELECT 'Table1' AS TableName, name, lastname 
    FROM Table1 
FULL JOIN Table2 ON Table1.name = Table2.name2 
           AND Table1.lastname = Table2.lastname 
2

Вы можете использовать функцию CHECKSUM, если вы уверены в том, что данные выражены одинаково.

Пример:

if not OBJECT_ID('Table1', 'Table') is null drop table Table1 
if not OBJECT_ID('Table2', 'Table') is null drop table Table2 
create table table1 
(id int identity(0, 1), 
    name varchar(128), 
    lastname varchar(128) 
) 
create table table2 
(id int identity(0, 1), 
    name varchar(128), 
    lastname varchar(128) 
) 
insert into table1 (name, lastname) values ('John', 'rose') 
insert into table1 (name, lastname) values ('Demy', 'Sanches') 
insert into table2 (name, lastname) values ('John', 'rose') 
insert into table2 (name, lastname) values ('Demy', 'Sanches') 
insert into table2 (name, lastname) values ('Ruby', 'Core') 

select 
    table2.* 
from table1 
    right outer join table2 on CHECKSUM(table1.name, table1.lastname) = CHECKSUM(table2.name, table2.lastname) 
where table1.id is null 

Смотрите CHECKSUM MSDN topic для получения дополнительной информации.

0
create table #test 
(
    Sno INT IDENTITY(1,1), 
    ExpDate VARCHAR(50), 
    Amt INT, 
    Amt1 INT, 
    Amt2 INT, 
    SumoAmt INT 
) 

create table #test1 
(
    Sno INT IDENTITY(1,1), 
    ExpDate VARCHAR(50), 
    Amt INT, 
    Amt1 INT, 
    Amt2 INT, 
    SumoAmt INT 
) 

INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,10,40) 
INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,20,50) 
INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,30,60) 
INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',NULL,20,40,70) 

INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,10,40) 
INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,20,50) 
INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,30,60) 
INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',NULL,20,40,70) 

SELECT MIN(TableName) as TableName, Sno,Expdate,Amt,Amt1,Amt2,SumoAmt 
FROM 
(
    SELECT '#test' as TableName,Sno,Expdate,Amt,Amt1,Amt2,SumoAmt 
    FROM #test 
    UNION ALL 
    SELECT '#test1' as TableName,Sno,Expdate,Amt,Amt1,Amt2,SumoAmt 
    FROM #test1 
) tmp 
GROUP BY Sno,Expdate,Amt,Amt1,Amt2,SumoAmt 
HAVING COUNT(*) = 1 
ORDER BY sno 
+1

Вам следует подумать над тем, чтобы уточнить свой ответ, предоставив некоторые сведения о том, что вы делаете, и о том, как он отвечает на вопрос OP. – forsvarir

16
Select * from Table1 
Except 
Select * from Table2 

Он покажет все записи несоответствия между table1 и table2

+0

Короткие и сладкие (и эффективные). Именно то, что я хотел. +1 – davidXYZ

+0

Beautiful ... :) – ABH

+4

Рассмотрите возможность использования 'union' следующим образом:' (Выберите * из таблицы1, кроме Select * from Table2) UNION (выберите * из таблицы2, кроме Select * from Table1) '. Это даст вам удаленные или добавленные строки в обеих таблицах. – slartidan

0

Если вы хотите отличия от обоих таблицы.

(SELECT  *, 'in Table1' AS Comments 
FROM  Table1 
EXCEPT 
SELECT  * , 'in Table1' AS Comments 
FROM  Table2) 
UNION 
(SELECT  *, 'in Table2' AS Comments 
FROM  Table2 
EXCEPT 
SELECT  *, 'in Table2' AS Comments 
FROM  Table1) 
16

поздний ответ, но может быть полезным для других читателей этой теме

Помимо других решений, я могу рекомендовать сравнение SQL инструмент под названием ApexSQL Data Diff.

Я знаю, что вы предпочли бы решение не на основе программного обеспечения, но и для других посетителей, которые могут захотеть сделать это в более простом способе, я настоятельно рекомендую читать эту статью: http://solutioncenter.apexsql.com/how-to-compare-sql-server-database-tables-with-different-names/

В статье описывается, как использовать функцию сопоставления объектов в ApexSQL Data Diff, что особенно полезно в ситуациях, когда две таблицы имеют одно и то же имя, но имена их столбцов разные.

Для обработки такого случая - каждая пара столбцов должна быть сопоставлена ​​вручную, чтобы данные, хранящиеся в них, включались при сравнении таблиц базы данных SQL для различий.