Можно ли создать уникальный идентификатор в представлении SQL Server, который будет оставаться неизменным при каждом вызове представления? - PullRequest
6 голосов
/ 03 декабря 2009

У меня есть 10 таблиц, которые я объединяю, чтобы создать представление. Я выбираю только идентификатор из каждой таблицы, но в представлении каждый идентификатор может отображаться несколько раз, однако сочетание всех идентификаторов всегда будет уникальным. Есть ли способ создать еще один столбец в этом представлении, который будет иметь уникальный идентификатор?

Я бы хотел сохранить уникальный идентификатор и использовать его для запроса к представлению, чтобы получить все остальные идентификаторы.

Ответы [ 6 ]

4 голосов
/ 12 июля 2011

У меня была похожая проблема, когда мне нужно было установить иерархию по нескольким таблицам. Если вы используете целое число в качестве идентификатора в каждой из таблиц, вы можете просто преобразовать идентификаторы каждой таблицы в varchar и поставить перед ними префикс с другой буквой для каждой таблицы. Например

CREATE VIEW LocationHierarchy as</p> <pre><code>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 голос
/ 22 июля 2011

Да, недавно у меня было такое же требование.

При создании представления сохраните оператор выбора как 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;
1 голос
/ 03 декабря 2009

Я думаю, что вы можете сделать это с помощью ROW_NUMBER (), по крайней мере, если вы можете гарантировать порядок представления. Например:

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

Пока порядок остается тем же, а в конце добавляются только поля, идентификатор будет уникальным.

1 голос
/ 03 декабря 2009

Нет, вы не можете сделать это в представлении, вы можете создать временную таблицу для хранения всей этой информации и создать ключ или уникальный идентификатор для каждой строки.

0 голосов
/ 04 декабря 2009

Одной из возможностей может быть вызов функции из вашего представления, которая вычисляет хэш-код для всех столбцов идентификатора. Если вы используете приличный криптографический алгоритм хеширования, вероятность столкновения будет крошечной (вероятно, вероятность того, что диск доставит неверные данные). Еще проще, конечно, можно просто объединить различные идентификаторы в один, гораздо больший идентификатор, возможно, в виде двоичного или varbinary столбца.

Сохранение этого идентификатора и возможность запроса по нему будет немного больше работы. Я не могу придумать, как рассчитать и сохранить его из вида. Вам, вероятно, понадобится хранимая процедура, чтобы сначала создать ее; детали сильно зависят от специфики вашего приложения.

0 голосов
/ 03 декабря 2009

Тот факт, что вы пытаетесь это сделать, указывает на гораздо большие проблемы в дизайне базы данных и / или архитектуре приложения.

Поскольку у вас есть 10 таблиц, и я собираюсь догадаться, что конструктор (и) БД просто добавили идентификатор INT IDENTITY ко всем таблицам, в результате вы получите около (2 ^ 31) ^ 10 возможных строк в таблица.

Единственный тип данных, который я могу придумать, который мог бы охватить это число, - это преобразовать все целые числа в строки с нулевыми отступами и собрать их все вместе как большой символ CHAR.

Хотя я предполагаю, что ваша настоящая проблема не в том, чтобы получить этот идентификатор для представления, а в том, что вы пытаетесь сделать, и это вопрос, который вам следует задать. Просто предчувствие.

...