#sql #sql-server #tsql
Вопрос:
Я хочу обновить «Роль 1» из приведенной ниже таблицы для идентификатора в (1,2,3,5,6) с ролью 1= 133 (передано в качестве параметра).
Логика должна обновлять Role1 только для идентификатора (1,2), так как значение Role2 для идентификатора 4 равно значению Role2 для идентификатора 1,2 —(‘AB’)
Таким образом , идентификатор (3,5,6) не должен обновляться и печататься как исключение, в то время как идентификатор(1,2) должен быть обновлен.
Любая помощь и советы будут оценены по достоинству
Спасибо
---------- ------- -------- --------
| ID | role1 |role2 |Not |
---------- ------- -------- --------
| 1 | 123 | AB | 0 |
| 2 | 456 | AB | 1 |
| 3 | 789 | EF | 0 |
| 4 | 133 | AB | 0 |
| 5 | 453 | EF | 1 |
| 6 | 764 | DF | 0 |
---------- ------- -------- --------
output
---------- ------ ------ ------
| ID | role1|role2 |not |
---------- ------ ------ ------
| 1 | 133 | AB |0 |
| 2 | 133 | AB |1 |
---------- ------ ------ ------
SELECT '789', '453', '764' 'As they could not be updated due to seperate role2'
Комментарии:
1. Ваш вопрос описывает «обновление». Однако ваши результаты и пример запроса таковы
select
. Не могли бы вы уточнить?2. @GordonLinoff: Вывод выполняется после обновления строк ; amp; исключенные строки отображаются как отдельный оператор
3. Как вы определяете, какие
ID
из них нуждаются вrole1
обновлении? Я предполагаю из вашего вопроса , что он не основан наID
, но основан ли он наrole2 = 'AB'
?4. Я передаю идентификатор (1,2,3,5,6) и role1=133 в качестве параметра SP, и в зависимости от значения Role2 логика обновления работает
5. Извините, но я просто не понимаю отношений, которые используются для исключения 3, 5 и 6 из обновления. Имеют ли строки право на обновление, потому что они имеют
role2
значение, равное значению строки сrole1
соответствующим параметром?
Ответ №1:
Делаю шаг, основанный на моем понимании сценария. Похоже, что требуется сначала найти Role2
строку, в которой есть Role1
переданный параметр, а затем обновить все строки, которые имеют общий доступ к нему, Role2
и Role1
строку, которая не соответствует параметру.
/* Set up the test scenario */
DECLARE @role1 INT = 133;
DROP TABLE IF EXISTS #roles
CREATE TABLE #roles
(
ID INT,
Role1 INT,
Role2 VARCHAR(2),
[NOT] INT
);
INSERT INTO #roles (ID, Role1, Role2, [Not])
VALUES
(1, 123, 'AB', 0),
(2, 456, 'AB', 1),
(3, 789, 'EF', 0),
(4, 133, 'AB', 0),
(5, 453, 'EF', 1),
(6, 764, 'DF', 0);
/* Selecting in order to validate the output set */
SELECT r2.*
FROM #roles AS r1
JOIN #roles AS r2
ON r1.Role2 = r2.Role2
WHERE r1.Role1 = @role1
AND r2.Role1 <> @role1;
После подтверждения набора вот как UPDATE
это может выглядеть
UPDATE r2
SET r2.Role1 = @role1
FROM #roles AS r1
JOIN #roles AS r2
ON r1.Role2 = r2.Role2
WHERE r1.Role1 = @role1
AND r2.Role1 <> @role1;
SELECT *
FROM #roles;
---- ------- ------- -----
| ID | Role1 | Role2 | NOT |
---- ------- ------- -----
| 1 | 133 | AB | 0 |
| 2 | 133 | AB | 1 |
| 3 | 789 | EF | 0 |
| 4 | 133 | AB | 0 |
| 5 | 453 | EF | 1 |
| 6 | 764 | DF | 0 |
---- ------- ------- -----