use*_*648 9 sql sql-server greatest-n-per-group
我有一个类似的查询
SELECT S.product_id, S.link, C.id AS category_id
FROM Products P
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1
LEFT OUTER JOIN Categories C ON c.product_id = P.id
WHERE P.active = 1
Run Code Online (Sandbox Code Playgroud)
只要每个产品只分配给一个类别,我就能正常工作.但是,如果将产品分配给许多类别,则会返回所有可能的组合.
我是否只能选择第一个,如果产品没有任何类别,则仍应使用category_id = NULL返回链接
您可以使用GROUP BY以及聚合函数(最有可能是MIN或MAX )来完成此操作。
根据您在结果中喜欢的类别 ID,您可以选择最小值。
SELECT S.product_id, S.link, MIN(C.id) AS category_id
FROM Products P
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1
LEFT OUTER JOIN Categories C ON c.product_id = P.id
WHERE P.active = 1
GROUP BY S.product_id, S.link
Run Code Online (Sandbox Code Playgroud)
或者最大。
SELECT S.product_id, S.link, MAX(C.id) AS category_id
FROM Products P
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1
LEFT OUTER JOIN Categories C ON c.product_id = P.id
WHERE P.active = 1
GROUP BY S.product_id, S.link
Run Code Online (Sandbox Code Playgroud)
一种简单的方法是使用外部应用,以便具有相关联接,并使其成为前1个查询.因此,您可以访问相关类别记录的所有列.我在这里添加一个类别名称作为示例:
select s.product_id, s.link, c.id as category_id, c.name as category_name
from products p
inner join seo s on s.product_id = p.id
outer apply
(
select top 1 *
from categories cat
where cat.product_id = p.id
order by cat.id
) c
where p.active = 1
and p.product_type = 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5060 次 |
| 最近记录: |