我有10张桌子,我正在一起创建一个视图。我只是从每个表中选择ID,但在视图中,每个ID可以显示多次,但是所有ID的组合将始终是唯一的。有没有办法在此视图中创建另一列作为唯一ID?
我希望能够存储唯一ID并使用它来查看视图以获取所有其他ID。
答案 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并能够对其进行查询将会有更多工作。我想不出一种方法来计算它并从视图中存储它。您可能需要一个存储过程来首先创建它;细节在很大程度上取决于您的应用程序的细节。