我有 10 个表,我将它们连接在一起以创建一个视图。我只是从每个表中选择 ID,但在视图中,每个 ID 可以显示不止一次,但是所有 ID 的组合将始终是唯一的。有没有办法在这个视图中创建另一个作为唯一 ID 的列?
我希望能够存储唯一 ID 并使用它来查询视图以获取所有其他 ID。
我有 10 个表,我将它们连接在一起以创建一个视图。我只是从每个表中选择 ID,但在视图中,每个 ID 可以显示不止一次,但是所有 ID 的组合将始终是唯一的。有没有办法在这个视图中创建另一个作为唯一 ID 的列?
我希望能够存储唯一 ID 并使用它来查询视图以获取所有其他 ID。
我有一个类似的问题,我需要跨多个表建立层次结构。如果您在每个表中使用整数作为 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
此解决方案的有效性将取决于您的数据集有多大。
我认为您可以使用 ROW_NUMBER() 来做到这一点,至少如果您可以保证视图的排序。例如:
SELECT
ROW_NUMBER() OVER (ORDER BY col1, col2, col3) as UniqueId
FROM <lotsa joins>
只要顺序保持不变,并且只在末尾添加字段,id 将是唯一的。
是的,最近我也有同样的要求。
创建视图时,将 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;
不,您不能在视图中执行此操作,您可以做的是创建一个临时表来保存所有这些信息,并在那里为每一行创建一个键或唯一 ID。
一种可能性是从您的视图中调用一个函数,该函数计算所有 ID 列的哈希码。如果您使用体面的加密哈希算法,那么发生冲突的可能性很小(很可能磁盘会传递错误的数据)。更简单的是,您当然可以将不同的 ID 连接成一个更大的 ID,可能是二进制或 varbinary 列。
存储该 ID 并能够对其进行查询将需要更多的工作。我想不出一种既可以计算它又可以从视图中存储它的方法。您可能需要一个存储过程来首先创建它;细节很大程度上取决于你的应用程序的细节。
您尝试这样做的事实表明数据库设计和/或应用程序架构中存在更大的问题。
由于您有 10 个表,我猜 DB 设计者只是对所有表使用 ID INT IDENTITY,您最终将在表中拥有大约 (2^31)^10 行。
我能想到的唯一可能涵盖该数字的数据类型是将所有整数转换为用 0 填充的字符串并将它们全部放在一起作为一个大 CHAR。
不过,我的猜测是,您真正的问题不是获取此 ID 以进行查看,而是您尝试做的其他事情,这是您应该问的问题。不过只是预感。