将多个表相互比较

时间:2019-04-05 09:42:35

标签: sql sql-server-2014

我不必花时间创建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狂。但是,确实存在问题的查询将对我有很大帮助。有人对解决方案有什么建议吗?

相关栏目:塔吉德,就这样。

最佳表格:

 Existing Tags            missing Tags
1
2
3
4
.
.

数字表示什么表:“ _ 0_100000”,“ _ 0_100001” ...

1 个答案:

答案 0 :(得分:0)

因此,我们假设此查询产生了所需的输出,即给定表集(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

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

Here is a working example on dbfiddle