2010-11-17 82 views
3

这是我第一次发布Stack Overflow,但已经发现它是一个非常宝贵的资源。按SQL 2005中相关子查询的结果分组

我的问题与SQL语句组中的相关子查询有关,我知道这是不可能的。我希望通过解释查询的意图,我可能会找到一些帮助。以最简单的形式,我试图通过相关子查询的结果通过主键和组进行聚合。用于关联的字段对于每个主键记录是唯一的。如果按照相关字段进行分组,则不会提供预期结果。我需要能够根据相关子查询的结果进行分组,但我不确定如何重组查询。下面提供了一个示例查询。

感谢

-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 

回答

2

乍一看,请尝试更改子查询的CROSS(或外部)应用。这将“列”从SELECT子句移动到FROM子句,从而允许分组。

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 

移入或移出聚集到派生表因此与此

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 

一个问题将是该CSV TargetJoinTableCommaDelimitedTranslatedList1可能会产生很多次:每一次当BaseTable.BaseKey我读这正确。这将是缓慢的。我的感觉是,CSV代应该持续到最后:您实际上是在TargetJoinTable.ChoiceKey上进行分组,而不是它生成的CSV。

+0

我使用了顶部的例子。这工作,以及改善我的整体查询性能。 – 2010-11-17 21:36:56