У меня нет доступа к вашим данным, поэтому я не могу предоставить конкретный пример c для вашей среды, но я могу предоставить вам простой пример с использованием SQL серверного оператора EXCEPT
.
Выполните следующий пример в SSMS:
-- Create a list of required values.
DECLARE @Required TABLE ( required_id INT, required_val VARCHAR(50) );
INSERT INTO @Required ( required_id, required_val ) VALUES
( 1, 'Required value 1.' ), ( 2, 'Required value 2.' ), ( 3, 'Required value 3.' ), ( 4, 'Required value 4.' ), ( 5, 'Required value 5.' );
-- Create some sample data to compare against.
DECLARE @Data TABLE ( PropertyId INT, RequiredId INT );
INSERT INTO @Data ( PropertyId, RequiredId ) VALUES
( 1, 1 ), ( 1, 2 ), ( 1, 3 ), ( 2, 1 ), ( 2, 2 ), ( 2, 4 ), ( 2, 5 );
-- Set a property id value to query.
DECLARE @PropertyId INT = 1;
-- Preview @Data's rows for the specified @PropertyId.
SELECT * FROM @Data WHERE PropertyId = @PropertyId ORDER BY PropertyId, RequiredId;
На этом этапе я создал список требуемых значений (required_id от 1 до 5) и некоторые фиктивные данные для их проверки. Этот начальный SELECT показывает текущий набор результатов для указанного @PropertyID:
+------------+------------+
| PropertyId | RequiredId |
+------------+------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
+------------+------------+
Вы можете видеть, что required_id значения 4 и 5 равны отсутствует для текущего свойства. Затем мы можем сравнить @Required с @Data и INSERT
любые отсутствующие обязательные значения с помощью оператора EXCEPT
и затем вернуть исправленный набор результатов.
-- Insert any missing required values for @PropertyId.
INSERT INTO @Data ( PropertyId, RequiredId )
SELECT @PropertyId, required_id FROM @Required
EXCEPT
SELECT PropertyId, RequiredId FROM @Data WHERE PropertyId = @PropertyId;
-- Preview @Data's revised rows for @PropertyId.
SELECT * FROM @Data WHERE PropertyId = @PropertyId ORDER BY PropertyId, RequiredId;
Обновленный набор результатов теперь выглядит следующим образом:
+------------+------------+
| PropertyId | RequiredId |
+------------+------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
+------------+------------+
Вы можете запустить это снова для @PropertyId = 2
, чтобы увидеть другой сценарий.
Обратите внимание на порядок использования EXCEPT. Сначала идут требуемые строки, за ними следует оператор EXCEPT, а затем текущие строки, которые необходимо проверить. Это важно. EXCEPT говорит, что покажите мне строки из @Required, которых нет в @ Data - что позволяет вставлять любые отсутствующие требуемые значения в @ Data.
Я знаю, что этот пример не представляет ваши существующие данные с Требуется 23 строки, но, надеюсь, это поможет вам найти решение для ваших нужд. Вы можете узнать больше об операторе EXCEPT
здесь .
Вот полный пример SSMS:
-- Create a list of required values.
DECLARE @Required TABLE ( required_id INT, required_val VARCHAR(50) );
INSERT INTO @Required ( required_id, required_val ) VALUES
( 1, 'Required value 1.' ), ( 2, 'Required value 2.' ), ( 3, 'Required value 3.' ), ( 4, 'Required value 4.' ), ( 5, 'Required value 5.' );
-- Create some sample data to compare against.
DECLARE @Data TABLE ( PropertyId INT, RequiredId INT );
INSERT INTO @Data ( PropertyId, RequiredId ) VALUES
( 1, 1 ), ( 1, 2 ), ( 1, 3 ), ( 2, 1 ), ( 2, 2 ), ( 2, 4 ), ( 2, 5 );
-- Set a property id value to query.
DECLARE @PropertyId INT = 1;
-- Preview @Data's rows for the specified @PropertyId.
SELECT * FROM @Data WHERE PropertyId = @PropertyId ORDER BY PropertyId, RequiredId;
-- Insert any missing required values for @PropertyId.
INSERT INTO @Data ( PropertyId, RequiredId )
SELECT @PropertyId, required_id FROM @Required
EXCEPT
SELECT PropertyId, RequiredId FROM @Data WHERE PropertyId = @PropertyId;
-- Preview @Data's revised rows for @PropertyId.
SELECT * FROM @Data WHERE PropertyId = @PropertyId ORDER BY PropertyId, RequiredId;