sql-server-2005 - 按 SQL 2005 中相关子查询的结果分组

标签 sql-server-2005 group-by correlated-subquery

这是我第一次在 Stack Overflow 上发帖,但我已经发现它是一个非常宝贵的资源。

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

谢谢

-约翰

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

最佳答案

乍一看,尝试将子查询更改为 CROSS(或 OUTER)APPLY。这会将“列”从 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。

关于sql-server-2005 - 按 SQL 2005 中相关子查询的结果分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4206826/

相关文章:

asp.net - 为什么我会间歇性地收到此错误? "The server was not found or was not accessible"

mysql - 查询保留未减去的元组

Python:获取列表中出现次数最多的项目

MySQL 多对多搜索

sql - 在 SQL 中获取系统日期时间前 10 分钟的记录

sql-server - 仅在 SQL Server 2005 Management Studio 选项卡中显示文件名

java - 按时间间隔 hibernate 分组

使用 ICriteria 的 NHibernate 相关子查询

mysql - 相关子查询 "unknown column"

mysql - 了解MySQL如何获取具有相同用户id的数据