MS SQL Обновление одной таблицы из другой таблицы с несколькими masterid и различными childid - PullRequest
0 голосов
/ 21 марта 2019

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

Ниже приведен сценарий

Table1:

+----------+---------+
| masterid | childid |
+----------+---------+
| 1        | NULL    |
+----------+---------+
| 1        | NULL    |
+----------+---------+
| 1        | NULL    |
+----------+---------+
| 2        | NULL    |
+----------+---------+
| 2        | NULL    |
+----------+---------+
| 1        | NULL    |
+----------+---------+

Table2:

+----------+---------+
| masterid | childid |
+----------+---------+
| 1        | 2       |
+----------+---------+
| 1        | 3       |
+----------+---------+
| 1        | 4       |
+----------+---------+
| 2        | 9       |
+----------+---------+
| 2        | 8       |
+----------+---------+
| 1        | 5       |
+----------+---------+

Я хочу обновить table1, сравнивая masterid из table2 и соответствующий childid должен быть обновлен.

Solution1: Использование ROW_NUMBER()

;
WITH cte
AS (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) rn
FROM @t1),
cte1
AS (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) rn
FROM @t2)

UPDATE t1
SET t1.childid = t2.childid
FROM cte AS t1
INNER JOIN cte1 AS t2
  ON t2.masterid = t1.masterid
  AND t2.rn = t1.rn

DEMO

Как этого можно достичь разными способами?

1 Ответ

0 голосов
/ 21 марта 2019

Пример данных

DECLARE @TAble1 AS TABLE (masterid INT , childid INT)
INSERT INTO @Table1
SELECT 1 , NULL UNION ALL
SELECT 1 , NULL UNION ALL
SELECT 1 , NULL UNION ALL   
SELECT 2 , NULL UNION ALL   
SELECT 2 , NULL UNION ALL   
SELECT 1 , NULL    

DECLARE @TAble2 AS TABLE (masterid INT , childid INT)
INSERT INTO @TAble2
SELECT  1, 2UNION ALL      
SELECT  1, 3UNION ALL      
SELECT  1, 4UNION ALL      
SELECT  2, 9UNION ALL      
SELECT  2, 8UNION ALL      
SELECT  1, 5  

Этого состояния обновления достаточно для обновления таблицы. Таблица1 Нет необходимости использовать любую оконную функцию

SELECT * FROM @TAble1

UPDATE T1
SET T1.childid = T2.childid
FROM @TAble1 T1
INNER JOIN @TAble2 T2
ON T1.masterid = T2.masterid

SELECT * FROM @TAble1

Результат до обновления

masterid    childid
1           NULL
1           NULL
1           NULL
2           NULL
2           NULL
1           NULL

Результат после обновления

masterid    childid
1            2
1            2
1            2
2            9
2            9
1            2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...