Скопируйте иерархические данные SQL в ту же таблицу с обновленными значениями

У меня есть столикпроектов«и стол»задачи«с иерархическими данными в моей базе данных SQL. Таким образом, задачи имеют подзадачи, которые связаны с» родительским «столбцом с его parentID. Root-Task-Parent равен 0.
Существует также столбец «project_id», который связывает задачу с конкретным проектом в Project-Table. Сейчас я хочу скопировать целое задание со всеми подзадачами и передать его в новый проект.

Таким образом, SQL-запрос будет

INSERT INTO tasks (text, date, parent, projectid)
SELECT text, date, parent, 89
FROM tasks WHERE projectid = 23

где 23 — это идентификатор старого проекта, а 89 — проект, к которому добавляются данные.

Но проблема в том, что он сохраняет родительское значение, поэтому моя корневая задача копируется правильно, но подзадачи по-прежнему ссылаются на старые задачи. Как я могу обновить parentID, чтобы все задачи и подзадачи ссылались на новую корневую задачу?

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

Спасибо за помощь!

Редактировать:
@Strawberry: я использую dhtmlxgantt создать и обновить задачу, но я хочу решить ее с помощью запросов SQL. Пример таблицы будет выглядеть так:
Скриншот базы данных

Так что в этом случае я хотел бы дублировать «Проект» на «Проект 2» с новым идентификатором проекта и соответствующие подзадачи с родительскими идентификаторами

0

Решение

Я предполагаю, что поле [текст] уникально для каждого проекта.

С этим предположением, вот мой запрос

--DROP TABLE [Tasks]

-- Create table
CREATE TABLE [dbo].[Tasks](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Text] [varchar](10) NOT NULL,  -- Assume that [Text] field is unique for each project
[Name] [varchar](50) NOT NULL,
[ParentId] [bigint] NULL,
[ProjectId] [bigint] NOT NULL,
CONSTRAINT [PK_Tasks] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Tasks]  WITH CHECK ADD  CONSTRAINT [FK_Tasks_Tasks] FOREIGN KEY([ParentId])
REFERENCES [dbo].[Tasks] ([Id])
GO

-- Remove all the data from the table and reseed the identity value
DELETE FROM [Tasks]
DBCC CHECKIDENT ('Tasks', RESEED, 1)

-- Sample Data population starts here...
INSERT INTO [Tasks] (text, Name, [ParentId], ProjectId)
SELECT 'A', 'A', null, 101 union ALL
SELECT 'B', 'B', null, 101 union ALL
SELECT 'C', 'C', null, 101

INSERT INTO [Tasks] (text, Name, [ParentId], ProjectId)
SELECT 'A1', 'A 1', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'A'), 101 union ALL
SELECT 'A2', 'A 2', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'A'), 101 union ALL
SELECT 'A3', 'A 3', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'A'), 101 union ALL
SELECT 'A4', 'A 4', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'A'), 101 union ALL
SELECT 'B1', 'B 1', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'B'), 101 union ALL
SELECT 'B2', 'B 2', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'B'), 101 union ALL
SELECT 'B3', 'B 3', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'B'), 101 union ALL
SELECT 'C1', 'C 1', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'C'), 101 union ALL
SELECT 'C2', 'C 2', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'C'), 101 union ALL
SELECT 'C3', 'C 3', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'C'), 101

INSERT INTO [Tasks] (text, Name, [ParentId], ProjectId)
SELECT 'A11', 'A 11', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'A 1'), 101 union ALL
SELECT 'A41', 'A 41', (SELECT [Id] FROM [Tasks] WHERE [Text] =  'A 4'), 101

-- Sample Data population ends here...
GO
-- Copy all the data from project 101 and insert it as 102 with parent id as null
INSERT INTO [Tasks] (text, Name, [ParentId], ProjectId) -- other column names can be here...
SELECT text, Name, null, 102 -- Other column values can be here...
FROM [Tasks] where ProjectId = 101

-- Update the parent id using the text field
UPDATE A
SET A.[ParentId] = C.NewParentId
FROM [Tasks] A
INNER JOIN (SELECT Child.text, Parent.[Text] Parenttext
FROM [Tasks] Child
INNER JOIN [Tasks] Parent
ON Child.[ParentId] = Parent.[Id]
WHERE Child.ProjectId = 101
) B
ON A.[Text] = B.[Text]
LEFT JOIN   (
SELECT [Id] NewParentId, [Text]
FROM [Tasks]
WHERE ProjectId = 102
) C
ON B.Parenttext = C.text
WHERE ProjectId = 102SELECT * FROM [Tasks] WHERE ProjectId = 102 Order By [Text]

Я надеюсь, что это может помочь вам

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]