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