使用导致问题的视图联合插入表

Posted

技术标签:

【中文标题】使用导致问题的视图联合插入表【英文标题】:insert into table using union of views causing issues 【发布时间】:2017-09-14 07:47:13 【问题描述】:

我正在尝试通过合并视图将数据插入临时表,但出现以下错误。这可能是什么原因。当我正常选择时,查询运行良好。

由于提示,查询处理器无法生成查询计划 在此查询中定义。重新提交查询而不指定任何提示 并且不使用 SET FORCEPLAN。

insert into #temp
SELECT 'aaa', COUNT(*) FROM view1
 UNION
 SELECT 'bbb', COUNT(*) FROM view2
 UNION
 SELECT 'ccc', COUNT(*) FROM view3
 UNION
 SELECT 'ddd', COUNT(*) FROM view4
 UNION
 SELECT 'eee', COUNT(*) FROM view5
 UNION
 SELECT 'fff', COUNT(*) FROM view6
 UNION
 SELECT 'ggg', COUNT(*) FROM view7
 UNION
 SELECT 'hhh', COUNT(*) FROM view8

【问题讨论】:

您使用的是哪个 dbms?顺便说一句,我会在这里做UNION ALL,因为没有要删除的重复项。 Microsoft SQL Server..使用 UNION ALL 可以解决问题吗? UNION ALL 是一般性建议。错误消息清楚地显示“重新提交查询而不指定任何提示且不使用 SET FORCEPLAN。 【参考方案1】:

您所写的内容应该有效。检查两件事。由于它是一个临时表,请检查从视图的 UNION 中删除任何视图是否可以修复它。然后,单独检查该视图。编写所有视图的脚本并检查其中是否有任何使用提示(如 NOLOCK、EXPAND 等)以及是哪一个导致了问题。

另外,你可以试试这样写

insert into #temp
SELECT field, total FROM 
 (SELECT 'aaa' field, COUNT(*) total FROM view1
 UNION
 SELECT 'bbb', COUNT(*) FROM view2
 UNION
 SELECT 'ccc', COUNT(*) FROM view3
 UNION
 SELECT 'ddd', COUNT(*) FROM view4
 UNION
 SELECT 'eee', COUNT(*) FROM view5
 UNION
 SELECT 'fff', COUNT(*) FROM view6
 UNION
 SELECT 'ggg', COUNT(*) FROM view7
 UNION
 SELECT 'hhh', COUNT(*) FROM view8) Z

【讨论】:

以上是关于使用导致问题的视图联合插入表的主要内容,如果未能解决你的问题,请参考以下文章

在 redshift 中使用分区视图(联合所有多个表)按表分区

将联合 SQL 视图加载到访问表中

创建基于前缀联合特定表的视图

MySQL线上偶然联合索引查询失败,导致全表扫描,正常查询索引都命中了

联合所有在 SQL Server 中的视图性能问题

Sql语法高级应用之四:使用视图实现多表联合数据明细