我不必花时间创建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” ...
答案 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
这将产生所有匹配表的合并结果。