Выберите строки из двух разных значений в одном столбце на основе значений, обновленных в строках другого столбца

#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  |
 ---- ------- ------- -----