2010-11-17 3 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

На первый взгляд, попробуйте изменить подзапрос крестик (или КОСМИЧЕСКОГО) ОТНОСИТЬСЯ. Это перемещает «столбец» в предложение FROM из предложения SELECT, что позволяет группировать.

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

Я использовал верхний пример. Это также улучшило производительность моего общего запроса. –

Смежные вопросы