是否可以在SQL Server视图中创建唯一ID,每次调用视图时都保持不变?

时间:2009-12-03 20:05:13

标签: sql sql-server views uniqueidentifier

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

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

6 个答案:

答案 0 :(得分:4)

我有一个类似的问题,我需要在多个表之间建立一个层次结构。如果在每个表中使用整数作为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]

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]

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

只要订单保持不变,并且最后只添加字段,则ID将是唯一的。

答案 3 :(得分:1)

是的,最近我有同样的要求。

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

以下是一个例子:

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;

答案 4 :(得分:0)

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

由于你有10个表,我猜想数据库设计师只是把ID INT IDENTITY打到所有表上,你最终会得到大约(2 ^ 31)^ 10个可能的行。表

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

我的猜测是,你真正的问题是没有为视图获取此ID,而是你正在尝试做的其他事情,这是你应该问的问题。只是预感。

答案 5 :(得分:0)

一种可能性是从您的视图中调用一个函数来计算所有ID列上的哈希码。如果你使用一个不错的加密哈希算法,碰撞的几率是微不足道的(可能更有可能是磁盘会传递坏数据)。更简单的是,您当然可以将不同的ID连接成一个更大的ID,可能是二进制或varbinary列。

存储该ID并能够对其进行查询将会有更多工作。我想不出一种方法来计算它并从视图中存储它。您可能需要一个存储过程来首先创建它;细节在很大程度上取决于您的应用程序的细节。