比较多个表格

问题描述 投票:1回答:1

我不一定花时间创建SQL查询,我维护并搜索数据库中的错误。我经常要比较两种类型的表,如果数据库很小,我不介意只写一个小查询。但有时,一些数据库是巨大的,而表的数量是巨大的。

我有一个具有压缩数据的表类型,另一个具有由压缩数据组成的聚合。有时,AggregateTables缺少一些ID,一些数据未计算。如果它只是一个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怪人。但是一个确实存在问题的查询会对我有所帮助。有没有人对解决方案有任何建议?

相关专栏:Taguids,就是这样。

最佳表:

 Existing Tags            missing Tags
1
2
3
4
.
.

数字意味着什么表:“_ 0_100000”,“_ 0_100001”......

sql sql-server-2014
1个回答
0
投票

因此,我们假设此查询生成了您想要的输出,即给定表集(0_100000等)中所有可能标记的列表,以及表示AggregateValueTagValueCompressed中是否存在给定标记的列:

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

这将产生所有匹配表的组合结果。

Here is a working example on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.