SQL Server создает идентификатор для каждого отдельного значения в столбце

#sql #sql-server

#sql #sql-server

Вопрос:

У меня есть таблица [DWH].[Разделение], которое выглядит следующим образом:

 | Company ID | Division Code | Division Key |
|------------|---------------|--------------|
| 01         | PROD          | 1            |
| 02         | PROD          | 2            |
| 01         | MAN           | 3            |
| 04         | MAN           | 4            |
| 03         | PROD          | 5            |
  

Я пытаюсь добавить новый столбец с именем [Глобальный код деления], чтобы всякий раз, когда вставляется строка с существующим [кодом деления], она будет соответствующим целочисленным значением из [Глобального кода деления], а когда вставляется строка с новым [кодом деления], будет использоваться следующее по величине целое значение из [Глобального кода деления]. Существующий столбец [Ключ разделения] использует идентификатор INT (1,1). Значения вставляются в эту таблицу только в том случае, если комбинация [Идентификатор компании] и [Код подразделения] не существует да в таблице.

Результат будет выглядеть следующим образом:

 | Company ID | Division Code | Division Key | Global Division Key |
|------------|---------------|--------------|---------------------|
| 01         | PROD          | 1            | 1                   |
| 02         | PROD          | 2            | 1                   |
| 01         | MAN           | 3            | 2                   |
| 04         | MAN           | 4            | 2                   |
| 03         | PROD          | 5            | 1                   |
  

Когда я добавляю новую строку с [кодом разделения] ‘FIN’, результатом будет:

 | Company ID | Division Code | Division Key | Global Division Key |
|------------|---------------|--------------|---------------------|
| 01         | PROD          | 1            | 1                   |
| 02         | PROD          | 2            | 1                   |
| 01         | MAN           | 3            | 2                   |
| 04         | MAN           | 4            | 2                   |
| 03         | PROD          | 5            | 1                   |
| 01         | FIN           | 6            | 3                   |
  

Данные для этой таблицы вставляются из промежуточной таблицы с помощью инструкции MERGE.

Я попытался использовать последовательность для этого, так что всякий раз, когда слияние вставляет новые данные, оно проверяет, есть ли уже глобальный ключ разделения для кода разделения строки. Если есть, предполагалось использовать этот код, если нет, возьмите следующее значение из последовательности. Однако SQL Server не позволяет мне использовать функцию СЛЕДУЮЩЕГО ЗНАЧЕНИЯ в подзапросе. Должно быть лучшее решение, чем использование курсора для последующей обработки [DWH].[Разделение] таблицы по строкам.

Любая помощь была бы высоко оценена!

Ответ №1:

Вы могли делать то, что хотите, с помощью триггера. Но это не очень хорошая идея.

У вас сбой в вашей модели данных. У вас должна быть отдельная таблица для глобальных подразделений с одной строкой для каждого кода и ключа глобального подразделения. Ключ может быть назначен как identity столбец.

Вы можете «скрыть» базовую структуру данных, используя индексированные представления, если хотите. То есть вы можете иметь представление, в котором данные выглядят как желаемые результаты. Однако под капотом есть две таблицы.

Комментарии:

1. Привет, спасибо за ответ! Я хотел бы избежать использования схемы snowflake и предпочитаю сохранять столбец [Глобальный ключ разделения] в таблице [Разделение]. Тем более, что нет «реальных» глобальных измерений. Столбец должен служить только средством сортировки [кода деления] по целому числу в BI-среде. В конечном итоге у меня все равно может получиться снежинка, и я просто соединю две таблицы в представлении позже. Еще раз спасибо!

2. @Stephan . , , Вы также можете вычислить идентификатор на лету, но если он хранится постоянно, это объект, достойный отдельной таблицы. Однако вам не обязательно предоставлять его пользователям в виде отдельной таблицы.