Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как сравнить две таблицы?  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
Я переписал view разработчиков, чтоб шустрей работало. Надо сравнить результаты. Минимальный результирующий сет получается порядка пяти тысяч строк, колонок два десятка. Есть идея просто выбрать из старого и нового представления в таблицы и эти таблицы сравнить один к одному. Причем, повторяю, join не катит, потому что полно NULL значений, и в принципе не запрещено их появление в любой строке и любой колонке, и нет уникального ключа. А как сравнить таблицы в общем случае? Подскажите идею плиз.
31 мар 05, 22:31    [1431936]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
Константин Заровный
Member

Откуда: Волгодонск
Сообщений: 954
А.Панков
А как сравнить таблицы в общем случае? Подскажите идею плиз.


Вот тебе сразу 3 идеи

1. цикл по таблице
while not Eof - искать - если нашел пометь одну и другую.

2. замени NULL на какое нить значение и JOIN


3. А как себя поведет JOIN с выключенным ANSI NULL
31 мар 05, 22:37    [1431938]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
3. ANSI_NULLS OFF ведет себя плохо в этом случае. Заджойнил по всем полям, посчитал количество строк - оно меньше реального. При ON - больше.

2. Мысль интересная. Надо попробовать. Только долго, конечно, скрипт писать.

1. Тоже интересно. Взять клиента с ADO и попробовать.

Жаль, наскоком не получается
31 мар 05, 22:46    [1431948]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
2-й вариант не годится. Если попадаются n одинаковых строк в обеих таблицах, то по каждая джойнится с каждой и в результ. сете имеем n*n строк.

Остается в ADO писать сравнение.
31 мар 05, 23:00    [1431957]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
папа акуз
Member

Откуда: dartanianoff.net
Сообщений: 68247
здрасьте!

а хде жы фсе гуры?

глоря, ты хде?

declare @table1 sysname, @table2 sysname, @sql varchar(8000)

select @table1 = 'table1', @table2 = 'table2'

set @sql = 'select * from ' + @table1 + ' t1 where not exists (select 1 from ' + @table2 + ' t2 where '

select @sql = @sql + 'isnull(convert(varchar(8000),t1.' + sc.name + '),'''') = isnull(convert(varchar(8000),t2.' + sc.name + '),'''') and '
from sysobjects so
	inner join syscolumns sc on so.id = sc.id
where so.name = @table1

set @sql = left(@sql, len(@sql) - 4) + ')'

exec (@sql)

тынц
31 мар 05, 23:30    [1431990]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1133
Попробуй такую конструкцию: (за резудьтат не ручаюсь...)
#T1 minus #T2:
select C1, C2, SUM(CNT) CNT from
(
  select C1, C2, count(*) CNT, 1 SID from #T1 goup by C1, C2
  union all
  select C1, C2, count(*) CNT, 2 SID from #T2 goup by C1, C2
)T 
group by C1, C2
having SUM(CNT)>0 or SUM(SID)=1

#T2 minus #T1:
select C1, C2, SUM(CNT) CNT from
(
  select C1, C2, count(*) CNT, 1 SID from #T1 goup by C1, C2
  union all
  select C1, C2, count(*) CNT, 2 SID from #T2 goup by C1, C2
)T 
group by C1, C2
having SUM(CNT)<0 or SUM(SID)=2
31 мар 05, 23:36    [1431996]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1133
Пардон, вот так:
#T1 minus #T2:
select C1, C2, SUM(CNT) CNT from
(
  select C1, C2,  count(*) CNT, 1 SID from #T1 goup by C1, C2
  union all
  select C1, C2, -count(*) CNT, 2 SID from #T2 goup by C1, C2
)T 
group by C1, C2
having SUM(CNT)>0 or SUM(SID)=1

 

#T2 minus #T1:
select C1, C2, SUM(CNT) CNT from
(
  select C1, C2,  count(*) CNT, 1 SID from #T1 goup by C1, C2
  union all
  select C1, C2, -count(*) CNT, 2 SID from #T2 goup by C1, C2
)T 
group by C1, C2
having SUM(CNT)<0 or SUM(SID)=2

 

31 мар 05, 23:38    [1432000]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
А.Панков
Я переписал view разработчиков, чтоб шустрей работало. Надо сравнить результаты. ... Подскажите идею плиз.

Если только сравнить на единтичность результаты то можно так:
use Northwind
go
set nocount on
exec master..xp_cmdshell 'bcp "select * from Northwind.dbo.Products order by ProductID" queryout %TEMP%\1.txt -c -t"," -T', no_output

-- Change some values
update Products set ProductName = 'Pavlova - 2' where ProductName = 'Pavlova'
update Products set ProductName = 'Chocolade - 2' where ProductName = 'Chocolade'

exec master..xp_cmdshell 'bcp "select * from Northwind.dbo.Products order by ProductID" queryout %TEMP%\2.txt -c -t"," -T', no_output

-- Change values back
update Products set ProductName = 'Pavlova' where ProductName = 'Pavlova - 2'
update Products set ProductName = 'Chocolade' where ProductName = 'Chocolade - 2'

exec master..xp_cmdshell 'fc %TEMP%\1.txt %TEMP%\2.txt'
31 мар 05, 23:42    [1432002]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
Папе Акузу.
Блин, здорово выглядит. И выдало даже чего-то. Спасибо, папа. Буду анализировать.
31 мар 05, 23:43    [1432003]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
Все, сравнил. Большое спасибо всем за изящные решения.
На T-SQL можно сделать все, весь вопрос - как:)
1 апр 05, 00:03    [1432019]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1133
Папе Акузу

create table TAB1(C1 int, C2 int)
create table TAB2(C1 int, C2 int)

insert TAB1 select 1,1
insert TAB1 select 1,1
insert TAB1 select 2,2

insert TAB2 select 1,1
1 апр 05, 00:11    [1432030]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две таблицы?  [new]
папа акуз
Member

Откуда: dartanianoff.net
Сообщений: 68247
Alexander Us
Папе Акузу

create table TAB1(C1 int, C2 int)
create table TAB2(C1 int, C2 int)

insert TAB1 select 1,1
insert TAB1 select 1,1
insert TAB1 select 2,2

insert TAB2 select 1,1


да, сынку, уел ты папку. :)

про таблицы без первичного ключа я даже и не подумал. вот что значит дурные привычки. :)
1 апр 05, 00:18    [1432038]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить