【问题标题】:Is it possible to create a Unique ID in an SQL Server View that will remain the same each time the view is called?是否可以在每次调用视图时保持相同的 SQL Server 视图中创建唯一 ID?
【发布时间】:2009-12-03 20:05:12
【问题描述】:

我有 10 个表,我将它们连接在一起以创建一个视图。我只是从每个表中选择 ID,但在视图中,每个 ID 可以显示不止一次,但是所有 ID 的组合将始终是唯一的。有没有办法在此视图中创建另一个作为唯一 ID 的列?

我希望能够存储唯一 ID 并使用它来查询视图以获取所有其他 ID。

【问题讨论】:

    标签: sql sql-server views uniqueidentifier


    【解决方案1】:

    我有一个类似的问题,我需要跨多个表建立层次结构。如果您在每个表中使用整数作为 id,您可以简单地将每个表的 id 转换为 varchar,并为每个表添加不同的字母作为前缀。比如

    CREATE VIEW LocationHierarchy as

    SELECT 'C' + CONVERT(VARCHAR,[Id]) as Id
          ,[Name]
          ,'S' + CONVERT(VARCHAR,[State]) as parent
      FROM [City]
      UNION
      SELECT 'S' + CONVERT(VARCHAR,[Id]) as Id
          ,[Name]
          ,'C' + CONVERT(VARCHAR,[Suburb]) as parent
      FROM [Suburb]
    

    等等

    此解决方案的有效性将取决于您的数据集有多大。

    【讨论】:

    • @tamago 对于像我这样正在研究类似主题并正在寻找答案的用户仍然有用。
    【解决方案2】:

    我认为您可以使用 ROW_NUMBER() 来做到这一点,至少如果您可以保证视图的排序。例如:

     SELECT
         ROW_NUMBER() OVER (ORDER BY col1, col2, col3) as UniqueId
     FROM <lotsa joins>
    

    只要顺序保持不变,并且只在末尾添加字段,id 将是唯一的。

    【讨论】:

    • 这不能保证每次的数字都相同。如果我有 (1, 1, 1) 和 (3, 3, 3) 它们将分别是 1 和 2。如果我再添加 (2, 2, 2) 那么 (3, 3, 3) 行现在将变为 3 而不是 2。
    • @Tom H:这就是为什么我把“如果你能保证订购”放在我的回答顶部:)
    • 保证订购并不能做到这一点。这不仅仅是行的顺序,而且不能添加新行并且不能更改行。换句话说,数据必须是完全静态的,除了在排序的最后添加行。
    • 是的,很遗憾,我认为我不能保证订单。您如何看待创建一个包含所有记录的表(基本上只有 10-12 个 ID)???然后我唯一关心的是在每个季度更新数据库时更新该表。对这个解决方案有什么想法吗?
    • @Tom H:这就是我的回答所说的吗? @Brendo:只要您有办法唯一标识视图中的一行,表格就可以正常工作!
    【解决方案3】:

    是的,最近我也有同样的需求。

    创建视图时,将选择语句保留为TEMP_TABLE,然后在此TEMP_TABLE 上使用Row_number() 函数。

    这是一个例子:

    CREATE VIEW VIEW_NM
    AS
    SELECT Row_number() OVER(ORDER BY column_nm DESC) AS 'RowNumber'  FROM 
    (SELECT COL1,COL2 FROM TABLE1
    UNION 
    SELECT COL1,COL2 FROM TABLE2
    ) AS TEMP_TABLE;
    

    【讨论】:

    • 不是row_number,我们不能将视图的现有唯一列设置为唯一标识符吗?
    【解决方案4】:

    不,你不能在视图中这样做,你可以做的是创建一个临时表来保存所有这些信息,并在那里为每一行创建一个键或唯一 ID。

    【讨论】:

    • +1'ed。但是,如果他希望该信息持久存在,则它不会是临时表,而是实际表。
    【解决方案5】:

    您尝试这样做的事实表明数据库设计和/或应用程序架构中存在更大的问题。

    由于您有 10 个表,我猜 DB 设计者只是对所有表添加了 ID INT IDENTITY,因此您最终将在表。

    我能想到的唯一可能涵盖该数字的数据类型是将所有整数转换为填充为 0 的字符串并将它们全部放在一起作为一个大 CHAR。

    但我的猜测是,您真正的问题不是获取此 ID 用于视图,而是您尝试做的其他事情,这是您应该问的问题。不过只是一种预感。

    【讨论】:

    • 是的,我完全同意,不幸的是,我一直在使用它,只是在寻找最好的方法。这是一个车辆数据库,因此有 50 多个表,每个表都包含自己的 ID,可以全部连接到下一个。我只是想把基本信息/ID 放在一起,以便从以下位置运行其他查询:VehicleID、BedID、BodyStyleID、BrakeID、DriveTypeID、EngineConfigID 等……真的不漂亮。
    【解决方案6】:

    一种可能性是从您的视图调用一个函数,该函数计算所有 ID 列的哈希码。如果您使用体面的加密哈希算法,那么发生冲突的可能性很小(很可能磁盘会传递错误的数据)。更简单的是,您当然可以将不同的 ID 连接成一个更大的 ID,可能是二进制或 varbinary 列。

    存储该 ID 并能够对其进行查询将需要更多工作。我想不出一种既可以计算它又可以从视图中存储它的方法。您可能需要一个存储过程来首先创建它;详细信息很大程度上取决于您的应用的具体情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 2017-08-08
      • 2013-04-03
      • 2020-07-13
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多