Pregunta

In a SQL Server database I have two tables, one a parent of the other. The child table has a many-to-one relationship with the parent. I need to return only one record for each parent with the top most corresponding child table record. However I cannot figure out how to do this.

The following is the query I have now:

SELECT DISTINCT
    products.id,
    sku,
    name,
    mediaid
FROM
    products
INNER JOIN 
    productmedia ON products.id = productmedia.productid
WHERE
    sku IN ('HCFL 207 23 (A)','HCFL 207 22 (A)','HCFL 207 21 (A)','HCFL 207 20 (A)')
    AND productmedia.sort = 100 

And I am getting the following:

183816  HCFL 207 20 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 1/4", WIDE INNER RACE INSERT -ASIAN   2929082
183816  HCFL 207 20 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 1/4", WIDE INNER RACE INSERT -ASIAN   2929083
183817  HCFL 207 21 (A) HCFL SERIES-2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 5/16", WIDE INNER RACE INSERT-ASIAN    2929138
183817  HCFL 207 21 (A) HCFL SERIES-2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 5/16", WIDE INNER RACE INSERT-ASIAN    2929139
183818  HCFL 207 22 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 3/8", WIDE INNER RACE INSERT -ASIAN   2929086
183818  HCFL 207 22 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 3/8", WIDE INNER RACE INSERT -ASIAN   2929087
183819  HCFL 207 23 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 7/16", WIDE INNER RACE INSERT -ASIAN  2929084
183819  HCFL 207 23 (A) HCFL SERIES- 2-BOLT FLANGE, ECCENTRIC LOCKING COLLAR, BORE DIA. 1 7/16", WIDE INNER RACE INSERT -ASIAN  2929085
¿Fue útil?

Solución

CROSS APPLY is your friend:

SELECT DISTINCT
    products.id,
    sku,
    name,
    mediaid
FROM
    products
    CROSS APPLY (
        SELECT TOP(1)
            * -- List the required columns!
        FROM
            productmedia
        WHERE           
            products.id = productmedia.productid
            AND productmedia.sort = 100 
        ORDER BY
            YourOrderColumn -- Change it to your required order!
    ) AS X
WHERE
    sku IN ('HCFL 207 23 (A)','HCFL 207 22 (A)','HCFL 207 21 (A)','HCFL 207 20 (A)')

Otros consejos

;with cte as(
select s.id studentId, s.name, c.class, 
ROW_NUMBER() over(partition by class order by s.id) rn 
from Student s
inner join class c on s.classId = c.id
)
select * from cte where rn = 1

You can change "order by s.id" to any other column which you think is based to order the result.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top