只有第一行的左外连接
Left outer join with only first row
我有一个类似
的查询
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
只要每个产品只分配给一个类别,我就可以正常工作。但是,如果一个产品被分配到多个类别,它 returns 所有可能的组合。
我可以只 select 第一个吗,如果产品没有任何类别, link 仍然应该返回 category_id = NULL
您可以使用 GROUP BY to accomplish this along with an Aggregate function, most likely MIN or MAX.
根据您在结果中更喜欢的类别 ID,您可以 select 最小值。
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
或最大值。
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
使用子查询的替代解决方案:
SELECT S.product_id, S.link,
(
SELECT C.id FROM Categories C WHERE C.product_id = P.id AND
ROW_NUMBER() OVER(ORDER BY /* your sort option goes here*/ ) = 1
) AS category_id
FROM Products P
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1
WHERE P.active = 1
一个简单的方法是使用外部应用,以便有一个相关联,并使它成为前 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;
我有一个类似
的查询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
只要每个产品只分配给一个类别,我就可以正常工作。但是,如果一个产品被分配到多个类别,它 returns 所有可能的组合。
我可以只 select 第一个吗,如果产品没有任何类别, link 仍然应该返回 category_id = NULL
您可以使用 GROUP BY to accomplish this along with an Aggregate function, most likely MIN or MAX.
根据您在结果中更喜欢的类别 ID,您可以 select 最小值。
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
或最大值。
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
使用子查询的替代解决方案:
SELECT S.product_id, S.link,
(
SELECT C.id FROM Categories C WHERE C.product_id = P.id AND
ROW_NUMBER() OVER(ORDER BY /* your sort option goes here*/ ) = 1
) AS category_id
FROM Products P
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1
WHERE P.active = 1
一个简单的方法是使用外部应用,以便有一个相关联,并使它成为前 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;