Сравните результаты ROW COUNT - PullRequest
0 голосов
/ 25 октября 2019

У меня есть 2 базы данных на одном сервере, и мне нужно сравнить регистры на каждом из них, поскольку одна из баз данных не импортирует всю информацию

Я пытался выполнить подсчет ROW, но это не такworking

В настоящее время я делаю пакеты из приблизительно 100 000 строк и просматриваю их в Excel.

Допустим, я хочу запрос, который подсчитывает каждый идентификатор в таблице A, а затем сравниваетрезультат подсчета VS TABLE B count для каждого идентификатора, так как они имеют одинаковый идентификатор, счет должен быть одинаковым, и я хочу, чтобы он приводил мне идентификатор, по которому есть какое-либо несоответствие между счетами.

Ответы [ 4 ]

1 голос
/ 26 октября 2019
--this table will contain the count of occurences of each ID in tableA
declare @TableA_Results table(
ID bigint,
Total bigint
)
insert into @TableA_Results 
select ID,count(*) from database1.TableA
group by ID
--this table will contain the count of occurences of each ID in tableB
declare @TableB_Results table(
ID bigint,
Total bigint
);
insert into @TableB_Results 
select ID,count(*) from database2.TableB
group by ID
--this table will contain the IDs that doesn't have the same amount in  both tables 

declare @Discordances table(
ID bigint,
TotalA bigint,
TotalB bigint
)
insert into @Discordances
select TA.ID,TA.Total,TB.Total
from @TableA_Results TA
inner join @TableB_Results TB on TA.ID=TB.ID and TA.Total!=TB.Total
--the final output
select * from @Discordances
1 голос
/ 25 октября 2019

Вы можете full outer join два агрегатных запроса и извлечь id s, которые либо отсутствуют в одной таблице, либо для которых количество записей отличается:

select coalesce(ta.id, tb.id), ta.cnt, tb.cnt
from 
    (select id, count(*) cnt from tableA) ta
    full outer join (select id, count(*) cnt from tableB) tb
        on ta.id = tb.id
where 
    coalesce(ta.cnt, -1) <> coalesce(tb.cnt, -1)
1 голос
/ 25 октября 2019

Вы, кажется, хотите агрегацию и full join:

select coalesce(a.id, b.id) as id, a.cnt, b.cnt
from (select id, count(*) as cnt
      from a
      group by id
     ) a full join
     (select id, count(*) as cnt
      from b
      group by id
     ) b
     on a.id = b.id
where coalesce(a.cnt, 0) <> coalesce(b.cnt, 0);
1 голос
/ 25 октября 2019

Вопрос неясен, но, возможно, этот код SQL может помочь подтолкнуть вас в правильном направлении.

Он захватывает идентификаторы и счетчики каждого идентификатора из базы данных один, идентификаторы и счетчики идентификаторов из базы данных дваи сравнивает их, перечисляя все строки, где счетчики различны.

WITH DB1Counts AS (
    SELECT ID, COUNT(ID) AS CountOfIDs
    FROM DatabaseOne.dbo.TableOne
    GROUP BY ID
), DB2Counts AS (
    SELECT ID, COUNT(ID) AS CountOfIDs
    FROM DatabaseTwo.dbo.TableTwo
    GROUP BY ID
)
SELECT a.ID, a.CountOfIDs AS DBOneCount, b.CountOfIDs AS DBTwoCount
  FROM DB1Counts a
       INNER JOIN DB2Counts b ON a.ID = b.ID
 WHERE a.CountOfIDs <> b.CountOfIDs 

Этот SQL выбирает из определенных идентификаторов, используя нотацию «Database.Schema.Table». Поэтому замените «DatabaseOne» и «DatabaseTwo» именами ваших двух баз данных. И, конечно, замените TableOne и TableTwo именами ваших таблиц (я предполагаю, что они одинаковы). Это устанавливает два выбора, по одному для каждой базы данных, которые группируются по идентификатору, чтобы получить счетчик каждого идентификатора. Затем он объединяет эти два выбора по идентификатору и возвращает все строки, в которых значения различны.

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