powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух таблиц
9 сообщений из 9, страница 1 из 1
Сравнение двух таблиц
    #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
Сравнение двух таблиц
    #32070936
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам требуется сперва решить теоретическую задачу - придумать/найти способ уникальной идентификации проводок, однозначной в обеих системах. Тогда задача решиться просто и быстро.
...
Рейтинг: 0 / 0
Сравнение двух таблиц
    #32070949
Oleksa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что уникальная идентификация проводок невозможна в связи с принятой системой учета, изменить которую также не представляется возможным. :(
...
Рейтинг: 0 / 0
Сравнение двух таблиц
    #32070974
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вычисли HASH по полям которые у тебя отвечают за подлинность проводок и сравнивай HASH
...
Рейтинг: 0 / 0
Сравнение двух таблиц
    #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
Сравнение двух таблиц
    #32071425
Oleksa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 mahoune: Пожалуйста, немножко подробней с этого места. IMHO, HASH применительно к SQL Server это алгоритм, которым он обрабатывает JOIN в том случае, если оптимизатор запросов сочет это полезным.

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

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

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


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