Поиск в подчиненной таблице в SQL GROUP BY - PullRequest
0 голосов
/ 12 ноября 2009

Несколько недель назад я задал вопрос об удалении повторяющихся записей в SQL INNER JOIN. Код, который я использовал в конце концов, похож на следующий ответ:

SELECT ROW_NUMBER() OVER(ORDER BY " + orderField + @") AS RowNum,
       mt.ID AS mt_ID,
       mt.title AS mt_title,
       [...]
       MAX(st.title) AS st_title,
       -- Other aggregates (MAX, MIN, AVERAGE, ...) for all other columns
       -- from sttable, whatever is appropriate.
       [...]
FROM mttable AS mt 
INNER JOIN sttable AS st on mt.ID =st.ID
WHERE st.field <> 0 AND mt.title = @title
GROUP BY mt.ID,
         mt.title
         -- Group by everything else from mttable.

Это достаточно хорошо работает для устранения дубликатов, но проблема, с которой я столкнулся сейчас, заключается в том, что я хочу выполнять запросы к sttable (таблице, которая не группируется), а GROUP BY удаляет эти данные. Например, я хочу иметь возможность выполнить запрос WHERE st.title = '...'

Есть ли способ, которым я могу этого достичь? Спасибо.

1 Ответ

0 голосов
/ 12 ноября 2009

Попробуйте использовать CTE (общее табличное выражение) , которое сначала определит данные, которые вы хотите получить из таблицы sttable - в CTE, фильтре, объединении, группировке и т. Д., Что вы хотите делать внутри таблицы. Не уверен, что это сработает специально для того, что вы пытаетесь сделать, но, скорее всего, сработает. Если вы можете предоставить некоторые дополнительные сведения о том, что вы пытаетесь сделать (то есть, что вы хотите сделать конкретно в sttable, выполнить фильтрацию по определенным полям и т. Д.).

будет выглядеть примерно так:

with stData as
(
    select  st.ID, st.field
    from    sttable st
    where   st.field <> 0
    -- Add additional filters here
    and st.someOtherField = something
)
SELECT ROW_NUMBER() OVER(ORDER BY orderField) AS RowNum,
       mt.ID AS mt_ID,
       mt.title AS mt_title,
       MAX(st.title) AS st_title,
       -- Other aggregates (MAX, MIN, AVERAGE, ...) for all other columns
       -- from sttable, whatever is appropriate.
FROM mttable AS mt 
INNER JOIN stData AS st 
on mt.ID =st.ID
WHERE st.field <> 0 
AND mt.title = @title
GROUP BY mt.ID,
         mt.title
         -- Group by everything else from mttable.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...