Обновление нескольких таблиц с указанием порядка между ними - PullRequest
0 голосов
/ 15 июля 2011

Хорошо, может быть, это сложный вопрос, но я знаю, что это может случиться с некоторыми из нас.Я постараюсь сделать его как можно короче.

У меня есть 4 таблицы, 1 родительская таблица и 3 дочерние таблицы.(для этого примера они имеют одинаковые столбцы, в моем реальном случае это не так).Вот так.

(все столбцы в 4 таблицах являются целыми числами)

PARENT                   
ID  POSITION             
1   1
2   1
3   1
4   1

CHILD1
IDPARENT, POSITION
1            2
1            3
1            4
1            6
2            3
2            4
3            2
3            5

CHILD2
IDPARENT, POSITION
1            5
1            7
2            2
3            3

CHILD3
IDPARENT, POSITION
4            2
4            3
3            6

У всех таблиц есть столбец с именем position, где это правила:

  1. Таблица PARENT всегда имеет позицию = 1
  2. Номер позиции является последовательным для каждого родителя, который не может быть продублирован во всех таблицах.(т. е. у родителя 1 есть дочерние элементы child1, child2 и child3, но позиция является последовательной 1, 2, 3, 4, 5, 6, 7, они не повторяются через них)
  3. последовательность не может быть последовательной в одной и той же таблице (т.е. родитель 1 имеет в дочернем элементе 1 позицию 2 3 4 6, но 5 и 7 находятся в дочернем элементе 2).
  4. родительможет иметь и не иметь потомков во всех таблицах (может иметь одновременно и дочерние1 и дочерние3 одновременно или только дочерние2 или ни у кого).
  5. Эти таблицы являются статическими, это всегда родитель и 3children.

Я написал запрос, чтобы получить idparent с указанием их соответствующих потомков и позиции.

SELECT C.IDPARENT,  '1' AS CHILD, c.POSITION
FROM  Child1 c
UNION ALL
SELECT C.IDPARENT,  '2' AS CHILD, c.POSITION
FROM Child2 c
UNION ALL
SELECT C.IDPARENT,  '3' AS CHILD, c.POSITION
FROM Child3 c
UNION ALL 
SELECT P.ID,  '0' AS CHILD,  P.POSITION
FROM PARENT P
ORDER BY IDPARENT, POSITION, CHILD

Он получает этот вывод с информацией выше.

IDPARENT CHILD POSITION
    1   0   1
    1   1   2
    1   1   3
    1   1   4
    1   2   5
    1   1   6
    1   2   7
    2   0   1
    2   2   2
    2   1   3
    2   1   4
    3   0   1
    3   1   2
    3   2   3
    3   1   5
    3   3   6
    4   0   1
    4   3   2
    4   3   3

Как видите, информация корректно исчисляется и это то, что я хочу.Но здесь есть Плохая запись

3   2   3
3   1   5

Она переходит с 3 на 5 вместо 4, потому что иногда в таблице эти записи удаляются внешним веб-приложением.

Итак, после всего этого, это моя проблема в том, что относится к предмету этого вопроса.

Как я могу сделать массовое обновление всех этих таблиц, в правильном порядке, для таких записей, как

  3   2   3
  3   1   5
  3   3   6

конвертируется в

 3   2   3
 3   1   4
 3   3   5

Примечание. В моем примере я только что сделал одну плохую запись.В моем реальном случае у меня их много.

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

Спасибо всем вам заранее за чтение этого длинного вопроса и за предоставленную помощь.

1 Ответ

1 голос
/ 15 июля 2011
;with cte as
(
  SELECT C.IDPARENT, c.POSITION
  FROM  Child1 c
  UNION ALL
  SELECT C.IDPARENT, c.POSITION
  FROM Child2 c
  UNION ALL
  SELECT C.IDPARENT, c.POSITION
  FROM Child3 c
  UNION ALL 
  SELECT P.ID, P.POSITION
  FROM PARENT P
)
select C.*, row_number() over(partition by IDPARENT order by POSITION) as rn
into #tmp
from cte as C

update C
  set Position = T.rn
from Child1 as C
  inner join #tmp as T
    on C.IDParent = T.IDParent and
       C.Position = T.Position

update C
  set Position = T.rn
from Child2 as C
  inner join #tmp as T
    on C.IDParent = T.IDParent and
       C.Position = T.Position

update C
  set Position = T.rn
from Child3 as C
  inner join #tmp as T
    on C.IDParent = T.IDParent and
       C.Position = T.Position

drop table #tmp

Выше приведен запрос для вас. Здесь вы можете попробовать с примерами данных в табличных переменных.Синтаксис для вставок для SQL Server 2008.

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