Сравнение нескольких таблиц друг с другом - PullRequest
1 голос
/ 05 апреля 2019

Я не обязательно трачу свое время на создание sql-запросов, я поддерживаю и ищу ошибки в базах данных.Мне постоянно приходится сравнивать два типа таблиц, и если база данных небольшая, я не против написать небольшой запрос.Но иногда некоторые базы данных огромны, и количество таблиц огромно.

У меня есть один тип таблиц, который содержит сжатые данные, а другой - агрегаты, состоящие из сжатых данных.Иногда в AggregateTables отсутствуют некоторые идентификаторы, некоторые данные не рассчитывались.Если это всего лишь один AggregateTable, я просто сравниваю его с соответствующей сжатой таблицей и сразу вижу, что нужно пересчитать (код для этого показан ниже).

 select distinct taguid from TLG.TagValueCompressed_0_100000
 where  exists
 (select * from tlg.AggregateValue_0_100000 where 
 AggregateValue_0_100000.TagUID = TagValueCompressed_0_100000.TagUID) 

Я хотел бы получитьтаблица, которая сравнивает все таблицы с другой и выплевывает таблицу со всеми несуществующими тегами.Мои знания по SQl находятся в зачаточном состоянии, и моя работа не требует, чтобы я был фанатом SQL.Но запрос, который говорит о проблеме, поможет мне много.Кто-нибудь есть какие-либо предложения для решения?

Соответствующие comlumns: Taguids, вот и все.

Оптимальная таблица:

 Existing Tags            missing Tags
1
2
3
4
.
.

Числа, означающие таблицу: "_0_100000", "_0_100001" ...

1 Ответ

0 голосов
/ 05 апреля 2019

Итак, давайте предположим, что этот запрос дал желаемый результат, т. Е. Список всех возможных тегов в данном наборе таблиц (0_100000 и т. Д.) И столбцы, указывающие, существует ли данный тег в AggregateValue и TagValueCompressed :

SELECT '0_100000' AS TableSet
     , ISNULL(AggValue.TagUID, TagValue.TagUID) AS TagUID
     , IIF(TagValue.TagUID IS NOT NULL, 1, 0) AS ExistsInTag
     , IIF(AggValue.TagUID IS NOT NULL, 1, 0) AS ExistsInAgg
  FROM (SELECT DISTINCT TagUID FROM tlg.AggregateValue_0_100000) AggValue
  FULL OUTER
  JOIN (SELECT DISTINCT TagUID FROM TLG.TagValueCompressed_0_100000) TagValue
    ON AggValue.TagUID = TagValue.TagUID

Таким образом, чтобы выполнить его для нескольких таблиц, мы можем сделать этот запрос шаблоном:

DECLARE @QueryTemplate NVARCHAR(MAX) = '
SELECT ''$SUFFIX$'' AS TableSet
     , ISNULL(AggValue.TagUID, TagValue.TagUID) AS TagUID
     , IIF(TagValue.TagUID IS NOT NULL, 1, 0) AS ExistsInTag
     , IIF(AggValue.TagUID IS NOT NULL, 1, 0) AS ExistsInAgg
  FROM (SELECT DISTINCT TagUID FROM tlg.AggregateValue_$SUFFIX$) AggValue
  FULL OUTER
  JOIN (SELECT DISTINCT TagUID FROM TLG.TagValueCompressed_$SUFFIX$) TagValue
    ON AggValue.TagUID = TagValue.TagUID';

Здесь $SUFFIX$ обозначает 0_100000 и т. Д. Теперь мы можем выполнить этот запрос динамически для всех таблиц, соответствующих определенному шаблону, например, скажем, у вас 500 таких таблиц.

DECLARE @query NVARCHAR(MAX) = ''
-- Produce a query for a given suffix out of the template
-- suffix is the last 8 characters of the table's name
-- combine all the queries, for all tables, using UNION ALL
SELECT @query += CONCAT(REPLACE(@QueryTemplate, '$SUFFIX$', RIGHT(name, 8)), ' UNION ALL ')
  FROM sys.tables
 WHERE name LIKE 'TagValueCompressed%';

-- Get rid of the trailing UNION ALL
SET @Query = LEFT(@Query, LEN(@Query) - LEN('UNION ALL '));

EXECUTE sp_executesql @Query

Это даст объединенные результаты для всех соответствующих таблиц.

Вот рабочий пример для dbfiddle .

...