开发者

Searching in subordinate table in an SQL GROUP BY

开发者 https://www.devze.com 2022-12-11 00:03 出处:网络
A few weeks ago I asked a question about eliminating duplicate records in a SQL INNER JOIN.The code I ended up using is similar to the following answer:

A few weeks ago I asked a question about eliminating duplicate records in a SQL INNER JOIN. The code I ended up using is similar to the following answer:

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开发者_JAVA技巧 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.

This works well enough at eliminating duplicates, but the problem I have now is that I want to perform queries on sttable (the table that is not grouped), and the GROUP BY eliminates this data. For example, I want to be able to run the query WHERE st.title = '...'

Is there any way I can achieve this? Thanks.


Try using a CTE (common table expression) that will first define the data you want to get from the sttable table - in the CTE, filter, join, group, etc. on whatever you want to do within the sttable table. Not sure if this will work specifically for what you are trying to do, but it most likely will. If you can provide some additional detail on what you are trying to do (i.e. what are you wanting to do specifically within sttable, filter on certain fields, etc.).

Would look something like this:

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.
0

精彩评论

暂无评论...
验证码 换一张
取 消