Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух таблиц / 9 сообщений из 9, страница 1 из 1
21.11.2002, 16:48:37
    #32070905
Oleksa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
Уважаемые господа,
В нашей конторе учет ведется в двух разных системах, грубо говоря один раз для налоговой инспекции и второй для иностранных акционеров.
Существует проблема сверки проводок в этих системах.
Опуская остальные подробности, нужно сравнить две таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE t1 (
	a [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	b [varchar] ( 10 ) NULL 
)

CREATE TABLE t1 (
	x [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	y [varchar] ( 10 ) NULL 
)

(где b и y – суммы проводок)

и найти не проведенные проводки. В таблицах, естественно, есть и другие поля, но беда в том, что для анализа пригодны только суммы.

Код: plaintext
1.
2.
3.
4.
5.
SELECT a, b, x, y
 FROM t1 AS tt1
 FULL OUTER JOIN
   t2 AS tt2
  ON tt1.b=tt2.y
 WHERE tt1.b is null or tt2.y is null

такой запрос хорош всем, кроме того, что не учитывает возможности проводок с одинаковыми суммами, т.е. если в одной из таблиц есть n проводок с некой суммой, а в другой m проводок с такой же суммой, то он их не покажет, а хотелось бы отобразить m-n любых из этих проводок.

Я хочу анализировать результат запроса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT a, b, x, y
 FROM t1 AS tt1
 FULL OUTER JOIN
   t2 AS tt2
  ON tt1.b=tt2.y
WHERE b IN 
(SELECT b FROM t1 AS ttt1
JOIN
t1 AS ttt2
	ON ttt1.b=ttt2.b
WHERE ttt1.a>ttt2.a
)
OR y IN 
(SELECT y FROM t2 AS ttt1
JOIN
t2 AS ttt2
	ON ttt1.y=ttt2.y
WHERE ttt1.x>ttt2.x
)

но не могу придумать, как это сделать... или можно придумать лучший способ?
...
Рейтинг: 0 / 0
21.11.2002, 17:16:41
    #32070936
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
Вам требуется сперва решить теоретическую задачу - придумать/найти способ уникальной идентификации проводок, однозначной в обеих системах. Тогда задача решиться просто и быстро.
...
Рейтинг: 0 / 0
21.11.2002, 17:27:30
    #32070949
Oleksa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
Дело в том, что уникальная идентификация проводок невозможна в связи с принятой системой учета, изменить которую также не представляется возможным. :(
...
Рейтинг: 0 / 0
21.11.2002, 17:47:01
    #32070974
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
Вычисли HASH по полям которые у тебя отвечают за подлинность проводок и сравнивай HASH
...
Рейтинг: 0 / 0
22.11.2002, 14:44:41
    #32071380
Michael Hopgarden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
Если не имеет значение какие из одинаковых проводок одной системы соответсвуют таким же из другой, то добавь поле счетчика для одинаковых проводок в каждой системе и заполняй перед сравнением. Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
update t1
   set
   cnt = (select 
      count(*) 
      from t1 as tt1 
      where 
      tt1.b = tt2.b
      and
   tt1.a <= tt2.a)
   from 
t1 as tt2
И далее join по t1.b = t2.y and t1.cnt = t2.cnt
...
Рейтинг: 0 / 0
22.11.2002, 15:54:56
    #32071425
Oleksa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
2 mahoune: Пожалуйста, немножко подробней с этого места. IMHO, HASH применительно к SQL Server это алгоритм, которым он обрабатывает JOIN в том случае, если оптимизатор запросов сочет это полезным.

2 Michael Hopgarden: Спасибо, на мой взгляд весьма элегантно, хотя я и надеялся обойтись без временных таблиц.
...
Рейтинг: 0 / 0
22.11.2002, 16:12:59
    #32071437
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
С ходу не нашел аналога в MSSQL функции подобной MD5 в UNIX или в MySQL. Но смысл от этого не меняется! Разберись какие поля отвечают за уникальность записи, сложи их и возьми по ним MD5 а потом сравнивай в базах одинаковые!
...
Рейтинг: 0 / 0
22.11.2002, 16:58:14
    #32071466
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
Извините, только мысли...

Ну, если подумать, какая из таблиц заполняется первой?
Для налоговой или для партнеров?
Или вообще эти данные дают разные службы сами по себе?
Как-то не верится, что дат нету...
>добавь поле счетчика для одинаковых проводок
Это проблемы не снимает, хотя уменьшает возможность не отследить какую-либо проводку
...
Рейтинг: 0 / 0
22.11.2002, 17:24:19
    #32071491
Oleksa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух таблиц
2 mahoune: Я так понял, что это способ предложенный Michael Hopgarden, но несколько усложненный.

2 Лëля: Просто разные бухгалтеры берут исходные документы и бьют проводки. Даты есть конечно, но в один день может быть неограниченное количество проводок с одинаковой суммой и одна проводка может быть вбита разными бухгалтериями в разные дни.
Предложение Michael Hopgarden вполне замечательное, я в экстазе!
Всем спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух таблиц / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]