添加SELECT DISTINCT ORDER BY到SQL Server视图

问题描述 投票:1回答:2

我需要创建下面的工作语句的SQL视图(Azure的SQL服务器)。我试图从堆栈溢出许多变化都无济于事。

返回正是我所需要的代码:

SELECT DISTINCT
CAST (valueColumn AS INT)
FROM dbo.valueDB
ORDER BY CAST (valueColumn AS INT)

当这个前缀代码...

CREATE VIEW [distinctValues]
AS

我得到以下错误:

Started executing query at Line 1

Msg 1033, Level 15, State 1, Procedure distinctValues, Line 7
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

我试着插入TOP (100) PERCENT到语句,并不能得到它的工作。我也read this is a "hack" of sorts and shouldn't be used in production。那么,如何得到我想要的视图中创建的声明?

sql sql-server tsql sql-view
2个回答
0
投票

您可以在视图定义中使用的CTE:

CREATE VIEW vwYourView
AS

    WITH AllValues
    AS (
        SELECT DISTINCT
            intValue = CAST (valueColumn AS INT)
            , intRank = ROW_NUMBER() OVER(PARTITION BY CAST (valueColumn AS INT) ORDER BY CAST (valueColumn AS INT))
        FROM dbo.valueDB
        )
    SELECT TOP(100) PERCENT intValue
    FROM AllValues
    WHERE intRank = 1
    ORDER BY intValue

0
投票

毫无疑问,最正确的方法是:

SELECT valueColumn FROM vwYourView ORDER BY valueColumn

然而,它发生ETL或者BI工具的具体允许你只能进行选择的表/视图,但不能写SQL和数据的顺序是非常重要的。

至少在目前的解决办法似乎仍然有效获得在这种情况下,一个期望的结果:

CREATE VIEW vwYourView
AS
SELECT  DISTINCT TOP (9223372036854775807)  CAST (valueColumn AS INT) AS valueColumn
FROM dbo.valueDB
ORDER BY valueColumn

从OP消息中提到的文章:

当然。有总是将是如何得到的SQL Server屈从于你的意志,即使只是暂时的 - 通过使用如此接近100%,这将全面上涨,或使用上限BIGINT类型的百分比:

© www.soinside.com 2019 - 2024. All rights reserved.