8

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

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

4

6 回答 6

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]

ETC

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

于 2011-07-12T04:12:56.453 回答
3

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

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

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

于 2009-12-03T20:19:30.680 回答
2

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

创建视图时,将 select 语句保留为 a TEMP_TABLE,然后Row_number()在 this 上使用函数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;
于 2011-07-22T14:03:59.877 回答
1

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

于 2009-12-03T20:15:37.287 回答
0

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

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

于 2009-12-04T10:37:22.697 回答
0

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

由于您有 10 个表,我猜 DB 设计者只是对所有表使用 ID INT IDENTITY,您最终将在表中拥有大约 (2^31)^10 行。

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

不过,我的猜测是,您真正的问题不是获取此 ID 以进行查看,而是您尝试做的其他事情,这是您应该问的问题。不过只是预感。

于 2009-12-03T20:23:34.527 回答