2009-09-09 7 views
0

J'ai une table qui ressemble à ceci:requêtes SQL - Copier les valeurs dans le tableau même

 
ProjectID TaskID  Date 
000   001  10/28/09 
000   002  12/1/09 
000   003  02/24/10 
001   001  04/14/10 
001   002  07/5/10 
001   003  02/24/11 
002   001  06/07/10 
002   002  07/7/10 
002   003  09/13/12 

Supposons qu'il existe de nombreux projets et de nombreuses tâches, mais chaque projet contient les mêmes tâches. Je souhaite copier les dates de la manière suivante:

Un projet (000) a les dates principales. Je veux copier ces dates pour chaque tâche à plusieurs autres projets (001, 002 dans les données d'exemple). Donc, si la tâche 001 du projet 000 a une date du 28/10/09, je veux que la tâche 001 dans d'autres projets (je connais leurs identifiants) ait la même date.

Si la tâche 002 du projet 001 est datée du 01/1/09, je souhaite que la tâche 002 ait également cette date dans chacun des autres projets.

Y at-il une requête qui peut faire cela? Je pense qu'il devrait y avoir, mais je ne peux pas le comprendre en ce moment.

Je BTW utilise SqlServer 2005.

Répondre

0
UPDATE dbo.Projects 
SET Date = (SELECT Date FROM dbo.Projects p1 
      WHERE p1.ProjectID = '000' AND p1.TaskID = dbo.Projects.TaskID) 
WHERE ProjectID IN ('P01', 'P02', 'P03', 'P04') 
AND TaskID IN ('001', '002', '003') 

Que ne le faire pour vous?

Donc, pour TaskID = 001, cette déclaration

SELECT Date FROM dbo.Projects WHERE ProjectID = '000' AND TaskID = '001' 

puis mettre à jour chacun des projets (P01-P04) et TaskID = 001 à cette date. C'est ce que tu cherches, non?

Vous pouvez également utiliser une clause OUTPUT pour vous prouver ce qui est mis à jour:

UPDATE dbo.Projects 
SET Date = (SELECT Date FROM dbo.Projects p1 
      WHERE p1.ProjectID = '000' AND p1.TaskID = dbo.Projects.TaskID) 
OUTPUT inserted.ProjectID, inserted.TaskID, inserted.Date 
WHERE ProjectID IN ('P01', 'P02', 'P03', 'P04') 
AND TaskID IN ('001', '002', '003') 

Cela entraînera chaque ligne mise à jour pour sortir les nouvelles valeurs (par exemple après la mise à jour) afin que vous puissiez vérifier et voir ce qui est mis à jour et à quelles valeurs.

juste couru la requête et ce sont les résultats que j'obtiens:

ProjectID TaskID Date 
    0  1 2009-10-28 00:00:00.000 
    0  2 2009-12-01 00:00:00.000 
    0  3 2010-02-24 00:00:00.000 
    1  1 2009-10-28 00:00:00.000 
    1  2 2009-12-01 00:00:00.000 
    1  3 2010-02-24 00:00:00.000 
    2  1 2009-10-28 00:00:00.000 
    2  2 2009-12-01 00:00:00.000 
    2  3 2010-02-24 00:00:00.000 

Les dates pour les projets 1 et 2 et tâches 1,2,3 ont été fixés aux valeurs du projet « maître » 0 .

+0

À première vue, il ne semble pas que cette requête correspond à la date du maître aux autres pour chaque tâche. Est-ce que je le lis incorrectement? –

+0

Il sélectionne la "Date" du projet "000" pour chaque TaskID que vous traitez, et définit la "Date" pour les autres projets à cette date sélectionnée –

+1

Celui qui vous a voté est fumer quelque chose, cela a fonctionné et avait une bonne explication. Merci beaucoup! –

0

peut-être quelque chose comme ceci:

INSERT INTO Projects(ProjectID, TaskID, Date) 
SELECT P2.ProjectId, P1.TaskID, P1.Date 
FROM Projects P1 
CROSS JOIN (SELECT DISTINCT ProjectID FROM Projects WHERE ProjectId <> '000') P2 

Je ne sais pas quel moteur base de données que vous utilisez, et certains peuvent permettre une syntaxe plus naturelle que ci-dessus. Ce qui précède suppose également que les intervalles de temps n'ont pas déjà été définis pour les autres projets et que vous essayez de définir de nouveaux intervalles de temps au lieu de mettre à jour les intervalles existants.

0

Cela devrait fonctionner très bien:

UPDATE projects SET [date] = (SELECT [date] FROM projects p1 WHERE project = '000' AND p1.task = projects.task) 
0

C'est ce que vous voulez, il suffit de remplacer « ... » avec la liste CSV des projets.

UPDATE c 
SET c.Date = p.Date 
FROM Projects AS [c] 
JOIN Projects AS [p] 
    ON p.TaskID = c.TaskID 
    AND p.ProjectID = '000' 
WHERE c.ProjectID IN (...) 
0
DECLARE @MasterProjectId varchar(10) 
DECLARE @ChildProjectIds varchar(100) 

Select 
@MasterProjectId = '000', 
@ChildProjectIds = '''123'',''456''' 


EXECUTE sp_executesql N'Update childProjects 
Set childProjects.[Date]= masterProject.[Date] 
from Projects masterProject 
Inner join Projects childProjects on childProjects.TaskId = masterProject.TaskId and childProjects.ProjectId in (' + @ChildProjectIds + ') 
where masterProject.ProjectId = ' + @MasterProjectId 
+0

il n'y a vraiment pas besoin de créer une instruction SQL dynamique et l'exécuter - semble trop compliqué, IMO –

+0

pour bien formater votre code, vous devez mettre en évidence vos lignes de code, puis appuyez sur le bouton "code" (010 101) sur la barre d'outils - fait un monde de différence! –

Questions connexes