Сравнение двух таблиц базы данных - PullRequest
1 голос
/ 15 сентября 2009

Мне нужно сравнить ВСЕ поля в двух таблицах ... они имеют одинаковый размер (четыре строки) и имеют одинаковое количество столбцов (пять столбцов). Логика, которую я ищу, это ...

If (table 1 = table 2)
do something
Else
do something else

В SQL я написал что-то вроде ...

If (Select * from table 1 = select * from table 2)
do something
else
do something else

ЭТО НЕ РАБОТАЕТ !!!

Я пытался выполнять операторы EXCEPT и UNION ALL ... но мне не нужно знать строку, которая отличается, или даже значения, которые отличаются, мне просто нужно знать BOOLEAN "да", таблицы разные или " нет, это не так.

Ответы [ 6 ]

9 голосов
/ 15 сентября 2009
1 голос
/ 15 сентября 2009

[Пересмотренный]

Вот как вы могли бы сделать это с помощью «SELECT ... EXCEPT ...»:

IF not exists(select *
               from MyTable
              except select *
               from MyOtherTable)
 and not exists(select *
               from MyOtherTable
              except select *
               from MyTable)
    PRINT 'They match'
ELSE
    PRINT 'They do not match'

Писать немного быстрее, если только вам не нужно сравнивать меньше, чем все столбцы. Для этого потребуется четыре сканирования таблицы, поэтому вы должны сравнить и сравнить производительность с представленными стратегиями UNION. По моему опыту SELECT ... EXCEPT ... имеет тенденцию работать очень быстро - я предполагаю, потому что все объединения и сравнение столбцов происходит внутри.

0 голосов
/ 02 апреля 2016

надоело писать все новые столбцы каждый раз, когда я расширяю код прослушивания.

" exec CompareTables table1, table2 " облегчит работу:

CREATE PROCEDURE [dbo].[CompareTables](@table1 varchar(100), 

 @table2 Varchar(100))

AS



-- Table1, Table2 are the tables or views to compare.

-- The columns of both tables are acquired from the table definition
-- ordered by the ordinal position 

-- The result is all rows from either table that do NOT match

-- the other table in all columns specified, along with which table that

-- row is from.



declare @SQL varchar(8000);
declare @T1ColumnList varchar(1000);

SET @T1ColumnList = (
Select TOP 1 Stuff(
        (
        Select ',' + C.COLUMN_NAME
        From INFORMATION_SCHEMA.COLUMNS As C
        Where C.TABLE_SCHEMA = T.TABLE_SCHEMA
            And C.TABLE_NAME = T.TABLE_NAME
        Order By C.ORDINAL_POSITION
        For Xml Path('')
        ), 1, 1, '') As Columns
From INFORMATION_SCHEMA.TABLES As T WHERE T.TABLE_NAME=@table1)
declare @T2ColumnList varchar(1000);
SET @T2ColumnList = (
Select TOP 1 Stuff(
        (
        Select ',' + C.COLUMN_NAME
        From INFORMATION_SCHEMA.COLUMNS As C
        Where C.TABLE_SCHEMA = T.TABLE_SCHEMA
            And C.TABLE_NAME = T.TABLE_NAME
        Order By C.ORDINAL_POSITION
        For Xml Path('')
        ), 1, 1, '') As Columns
From INFORMATION_SCHEMA.TABLES As T WHERE T.TABLE_NAME=@table2)



set @SQL = 'SELECT ''' + @table1 + ''' AS TableName, ' + @t1ColumnList +

 ' FROM ' + @Table1 + ' UNION ALL SELECT ''' + @table2 + ''' As TableName, ' +

 @t2ColumnList + ' FROM ' + @Table2



set @SQL = 'SELECT Max(TableName) as TableName, ' + @t1ColumnList +

 ' FROM (' + @SQL + ') A GROUP BY ' + @t1ColumnList + 

 ' HAVING COUNT(*) = 1'



exec ( @SQL)


GO
0 голосов
/ 15 сентября 2009

Если вы хотите сравнить только несколько столбцов (или таблиц с 2-5 столбцами), вы можете использовать это FULL JOIN (не проверено):

select      COUNT(*) AS UnmatchedRows
from        table1 t1
full join   table2 t2
        on  t1.col1 = t2.col1
        and t1.col2 = t2.col2
        and t1.col3 = t2.col3
        and t1.col4 = t2.col4
        and t1.col5 = t2.col5
where       COALESCE(t1.col1, t2.col1) IS NULL

Тем не менее решение, на которое ссылается Друид, очень круто.

0 голосов
/ 15 сентября 2009

Примерно так должно работать, используя Exist / Not Exists - тогда вам решать, как получить или не вернуть строку как True или False Фактический синтаксис будет зависеть от базы данных. Это Transact-SQL

Create table A
( one int, two int, three int , four int)

Create table B
( one int, two int, three int, four int)

insert A values ( 1,2,3,4)
insert B values( 1,2,3,4)

select * from A a
where exists ( select 1 from B b where 
    a.one = b.one
and a.two = b.two
and a.three = b.three
and a.four = b.four)

один два три четыре


1 2 3 4

0 голосов
/ 15 сентября 2009


ALTER PROCEDURE dbo.CompareTables
(
    @table1 VARCHAR(100), 
    @table2 VARCHAR(100), 
    @T1ColumnList VARCHAR(1000),
    @T2ColumnList VARCHAR(1000) = ''
)
AS
/*
    Table1, Table2 are the tables or views to compare.
    T1ColumnList is the list of columns to compare, from table1.
    Just list them comma-separated, like in a GROUP BY clause.
    If T2ColumnList is not specified, it is assumed to be the same
    as T1ColumnList.  Otherwise, list the columns of Table2 in
    the same order as the columns in table1 that you wish to compare.</p>

<pre><code>The result is all rows from either table that do NOT match
the other table in all columns specified, along with which table that
row is from.

* /

ОБЪЯВИТЬ @SQL VARCHAR (8000)

IF @ t2ColumnList = '' SET @ T2ColumnList = @ T1ColumnList

SET @SQL = 'SELECT' '' + @ table1 + '' 'AS TableName,' + @ t1ColumnList + 'FROM' + @ Table1 + 'UNION ALL SELECT' '' + @ table2 + '' 'TableName,' + @ t2ColumnList + 'FROM' + @ Table2

SET @SQL = 'SELECT Max (TableName) как TableName,' + @ t1ColumnList + 'FROM (' + @SQL + ') GROUP BY' + @ t1ColumnList + 'HAVING COUNT (*) = 1'

EXEC (@SQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...