在 SQL Server 视图中插入重复行

Posted

技术标签:

【中文标题】在 SQL Server 视图中插入重复行【英文标题】:Insert duplicate row in SQL Server view 【发布时间】:2018-07-10 06:29:11 【问题描述】:

我想知道是否可以在 SQL Server 2008 R2 中创建仅包含最后一列 (DateTime DESC) 的视图,但应将最后一行再次复制到视图中。

所以最终结果将是一个包含两行数据相同的视图。

选择一行的查询很简单:

SELECT TOP 1 * 
FROM Reporting
ORDER BY DateTime DESC 

SELECT TOP 1 *
FROM Reporting
WHERE DateTime IN (SELECT MAX(DateTime) 
                   FROM Reporting)

这只会返回一行,但我想在视图中再次复制这一行。

谢谢

【问题讨论】:

【参考方案1】:

上述答案中的语法无效。 UNION ALL 中的每个数据源中都不允许有ORDER BY。在最后的陈述中你只能有一个。所以,这是错误的:

SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC 
UNION ALL
SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC 

并且应该这样做:

SELECT * FROM (SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC)
UNION ALL
SELECT * FROM (SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC);

我会建议使用不同的方法。使用假数据源,然后cross apply

SELECT SI.*
FROM
(
    SELECT 1
    UNION ALL
    SELECT 2
) DS ([col])
CROSS APPLY
(

    SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC
) SI;

您可以轻松测试该语句的执行计划是否更好,仅导致一次排序和索引扫描:

【讨论】:

【参考方案2】:

尝试联合所有:

SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC 
UNION ALL
SELECT TOP 1 * FROM Reporting ORDER BY DateTime DESC 

【讨论】:

是的,我应该想到这一点,谢谢。我会尽快接受答案(必须等待 7 分钟) 这不是有效的语法。 gotqn 是正确的,我推荐他的解决方案,在性能方面也是 我必须同意@gotqn 这不是在视图中使用的有效语法。对不起

以上是关于在 SQL Server 视图中插入重复行的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中的表中删除重复行 [重复]

从 excel 导入数据时防止 SQL Server 2008 中的行重复

在 SQL Server 中获取重复行

Oracle SQL 多次插入忽略重复行

SQL Server 如何更改我的视图,使其在插入表时不会产生重复?

一行列表视图正在更新,但也插入了重复行