2010-11-17 54 views
3

C'est la première fois que je publie sur Stack Overflow, mais je l'ai déjà trouvé comme une ressource inestimable.Grouper les résultats d'une sous-requête corrélée dans SQL 2005

Ma question a à voir avec les sous-requêtes corrélées dans le groupe par une instruction SQL, ce que je comprends n'est pas possible. J'espère qu'en expliquant l'intention de la requête, je pourrai peut-être trouver de l'aide. Dans sa forme la plus simple, j'essaie d'agréger par une clé primaire et un groupe par les résultats d'une sous-requête corrélée. Le champ utilisé pour la corrélation est unique par enregistrement de clé primaire. Si je groupe par le champ de corrélation, il ne fournit pas les résultats escomptés. Je dois être capable de regrouper par les résultats de la sous-requête corrélée, mais je ne sais pas comment restructurer la requête. Un exemple de requête est fourni ci-dessous.

Merci

-John

SELECT DISTINCT 
    (SELECT substring(CommaDelimitedTranslatedList, 0, len(CommaDelimitedTranslatedList)) 
    FROM 
     ( 
      SELECT 
       cd.choiceValue + ',' 
      from SelectedChoiceTable sct 
       join ChoiceDescription cd on 
        cd.ChoiceID = sct.ChoiceID 
      where 
       sct.ChoiceSet = TargetJoinTable.ChoiceKey FOR XML PATH('') 
     ) D (CommaDelimitedTranslatedList)) AS   [TargetJoinTableCommaDelimitedTranslatedList1] , 
    count(BaseTable.BaseKey) 
FROM BaseTable 
    join TargetJoinTable on 
     BaseTable.BaseKey = TargetJoinTable.BaseKey 
Group By 
    [TargetJoinTableCommaDelimitedTranslatedList1] 
Order By 
    [TargetJoinTableCommaDelimitedTranslatedList1] ASC 

Répondre

2

À première vue, essayez de modifier la sous-requête à une croix (ou externe) doivent être appliqués. Cela déplace la "colonne" à la clause FROM de la clause SELECT permettant ainsi le regroupement.

SELECT 
    foo.TargetJoinTableCommaDelimitedTranslatedList1 , 
    count(BaseTable.BaseKey) 
FROM 
    BaseTable 
    join 
    TargetJoinTable on BaseTable.BaseKey = TargetJoinTable.BaseKey 
    CROSS APPLY 
    (
    SELECT 
     substring(CommaDelimitedTranslatedList, 0, 2000000000) 
       AS TargetJoinTableCommaDelimitedTranslatedList1 
    FROM 
     ( 
     SELECT 
      cd.choiceValue + ',' 
     from 
      SelectedChoiceTable sct 
      join 
      ChoiceDescription cd on cd.ChoiceID = sct.ChoiceID 
     where 
      sct.ChoiceSet = TargetJoinTable.ChoiceKey 
     FOR XML PATH('') 
     ) D (CommaDelimitedTranslatedList) 
    ) foo 
Group By 
    foo.TargetJoinTableCommaDelimitedTranslatedList1 
Order By 
    foo.TargetJoinTableCommaDelimitedTranslatedList1 ASC 

Ou déplacer l'ensemble sur une table dérivée ainsi

SELECT 
    COUNT(foo.BaseKey), 
    TargetJoinTableCommaDelimitedTranslatedList1 
FROM 
    (SELECT DISTINCT 
     (SELECT substring(CommaDelimitedTranslatedList, 0, len(CommaDelimitedTranslatedList)) 
     FROM 
      ( 
       SELECT 
        cd.choiceValue + ',' 
       from SelectedChoiceTable sct 
        join ChoiceDescription cd on 
         cd.ChoiceID = sct.ChoiceID 
       where 
        sct.ChoiceSet = TargetJoinTable.ChoiceKey FOR XML PATH('') 
      ) D (CommaDelimitedTranslatedList)) AS   [TargetJoinTableCommaDelimitedTranslatedList1] , 
    BaseTable.BaseKey 

    FROM BaseTable 
     join TargetJoinTable on 
      BaseTable.BaseKey = TargetJoinTable.BaseKey 
    ) foo 
Group By 
    [TargetJoinTableCommaDelimitedTranslatedList1] 
Order By 
    [TargetJoinTableCommaDelimitedTranslatedList1] ASC 

Un problème avec cela est que le TargetJoinTableCommaDelimitedTranslatedList1 CSV peut être généré à plusieurs reprises: une fois par BaseTable.BaseKey si je lis bien ce . Ce qui sera lent. Mon sentiment est que la génération CSV devrait venir en dernier: vous êtes en train de grouper sur TargetJoinTable.ChoiceKey, pas le CSV qu'il génère.

+0

J'ai utilisé l'exemple du haut. Cela a fonctionné ainsi que des performances améliorées sur ma requête globale. –