我不一定花时间创建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”......
因此,我们假设此查询生成了您想要的输出,即给定表集(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
这将产生所有匹配表的组合结果。