2008-10-24 7 views
1

Ok: Ceci est une partie de ma structure de table qui importe iciavec des agrégats dans Confus T-SQL

CaseStudyID int 
Title nvarchar(50) 
OverrideTitle nvarchar(50) 

Une partie de ma procédure

Declare @Temp table(CaseStudyID int, 
      Title nvarchar(50)) 

Insert Into @Temp 
SELECT CaseStudyID,Title 
FROM CaseStudy 
WHERE Visible = 1 AND DisplayOnHomePage = 1 
ORDER BY Title 

Update @Temp Set Title = TitleOverride 
--Here is where im lost if the title occurs more than once 
--I need to replace it with the override 
--Schoolboy error or leaking brain I cant get it going 


Select * From @Temp 

Quelqu'un peut-il aider?

+0

Il veut sortir le titre s'il n'y a pas de doublon. S'il y a un titre en double dans la table, il veut montrer le OverrideTitle (c'est ma conjecture). – splattne

+0

@splattne Oui c'était ça –

Répondre

1

qui remplacerait tous les titres qui apparaît plusieurs fois avec la valeur correspondante overrideTitle.

Il gardera la première occurrence de celui-ci, par exemple si vous avez 3 titres comme un, a, a la deuxième et troisième sera remplacé

select distinct 
    cs1.CaseStudyID, 
    case when cs2.CaseStudyID is null then cs1.Title else cs1.overrideTitle end as title 
from 
    CaseStudy cs1 
    left join CaseStudy cs2 
     on cs1.title = cs2.title 
     and cs1.CaseStudyID > cs2.CaseStudyID 

Si vous voulez remplacer tous juste modifier> à <> comme ci-dessous

select distinct 
    cs1.CaseStudyID, 
    case when cs2.CaseStudyID is null then cs1.Title else cs1.overrideTitle end as title 
from 
    CaseStudy cs1 
    left join CaseStudy cs2 
     on cs1.title = cs2.title 
     and cs1.CaseStudyID <> cs2.CaseStudyID 
1

Vous pouvez y parvenir sans utiliser la table tempory ainsi:

SELECT 
    MIN(CaseStudyID) AS CaseStudyID, 
    CASE WHEN count(*) = 1 THEN 
     MIN(Title) 
    ELSE 
     MIN(OverrideTitle) 
    END AS Title 
FROM CaseStudy 
GROUP BY Title 
ORDER BY Title 
2

Je ne sais pas si vous avez besoin chaque ligne de la table orginal. Voici donc ma solution de rechange qui vous donne toutes les lignes:

SELECT CaseStudyID, Title 
FROM CaseStudy c1 
WHERE NOT EXISTS (
    SELECT * FROM CaseStudy c2 
    WHERE c2.CaseStudyID <> c1.CaseStudyID and c2.Title = c1.Title 
) 

UNION ALL 

SELECT CaseStudyID, OverrideTitle 
FROM CaseStudy c1 
WHERE exists (
    SELECT * FROM CaseStudy c2 
    WHERE c2.CaseStudyID <> c1.CaseStudyID and c2.Title = c1.Title 
) 

ORDER BY Title