Sql ry因为主页类别有两个替代项,所以最终结果将显示为5行,而不是您要求的两行。但是下面的查询应该会给出您想要的结果: select x1.sku, x1.price, c.name, ac.altname from ( select x.sku, p.price, x.sort from ( select p.sku, min(c.sort) sort from products p left join ProductXCategories pxc on p.id = pxc.productid left join Categories c on pxc.categoryid = c.id group by p.sku ) x inner join products p on x.sku = p.sku ) x1 inner join categories c on x1.sort = c.sort left join AlternateCategoryName ac on c.id = ac.categoryid where c.active = 1
看 编辑:如果要将备选类别合并到一列中:Sql ry因为主页类别有两个替代项,所以最终结果将显示为5行,而不是您要求的两行。但是下面的查询应该会给出您想要的结果: select x1.sku, x1.price, c.name, ac.altname from ( select x.sku, p.price, x.sort from ( select p.sku, min(c.sort) sort from products p left join ProductXCategories pxc on p.id = pxc.productid left join Categories c on pxc.categoryid = c.id group by p.sku ) x inner join products p on x.sku = p.sku ) x1 inner join categories c on x1.sort = c.sort left join AlternateCategoryName ac on c.id = ac.categoryid where c.active = 1,sql,sql-server,Sql,Sql Server,看 编辑:如果要将备选类别合并到一列中: select distinct x1.sku, x1.price, c.name, STUFF((SELECT ',' + ac.altname FROM AlternateCategoryName ac WHERE c.id = ac.categoryid FOR XML PATH('') ),1,1,'') altname from (
select distinct x1.sku,
x1.price,
c.name,
STUFF((SELECT ',' + ac.altname
FROM AlternateCategoryName ac
WHERE
c.id = ac.categoryid
FOR XML PATH('')
),1,1,'') altname
from
(
select x.sku,
p.price,
x.sort
from
(
select p.sku,
min(c.sort) sort
from products p
left join ProductXCategories pxc
on p.id = pxc.productid
left join Categories c
on pxc.categoryid = c.id
group by p.sku
) x
inner join products p
on x.sku = p.sku
) x1
inner join categories c
on x1.sort = c.sort
left join AlternateCategoryName ac
on c.id = ac.categoryid
where c.active = 1
看
编辑#2:您声明只需要一个备选类别。您需要确定所需alt name的标准,但下面将选择max(altname)
:
请参见根据您的样本数据,您将获得
备选类别的两个结果
,因为主
类别有两个备选类别,因此最终结果将分为5行,而不是您要求的两行。但是下面的查询应该会给出您想要的结果:
select x1.sku, x1.price, c.name, ac.altname
from
(
select x.sku, p.price, x.sort
from
(
select p.sku, min(c.sort) sort
from products p
left join ProductXCategories pxc
on p.id = pxc.productid
left join Categories c
on pxc.categoryid = c.id
group by p.sku
) x
inner join products p
on x.sku = p.sku
) x1
inner join categories c
on x1.sort = c.sort
left join AlternateCategoryName ac
on c.id = ac.categoryid
where c.active = 1
看
编辑:如果要将备选类别合并到一列中:
select distinct x1.sku,
x1.price,
c.name,
STUFF((SELECT ',' + ac.altname
FROM AlternateCategoryName ac
WHERE
c.id = ac.categoryid
FOR XML PATH('')
),1,1,'') altname
from
(
select x.sku,
p.price,
x.sort
from
(
select p.sku,
min(c.sort) sort
from products p
left join ProductXCategories pxc
on p.id = pxc.productid
left join Categories c
on pxc.categoryid = c.id
group by p.sku
) x
inner join products p
on x.sku = p.sku
) x1
inner join categories c
on x1.sort = c.sort
left join AlternateCategoryName ac
on c.id = ac.categoryid
where c.active = 1
看
编辑#2:您声明只需要一个备选类别。您需要确定所需alt name的标准,但下面将选择max(altname)
:
请参见这里的一个例子。此查询选择最小的类别(TblCategory.Sort)。如果需要使用min(TblProductXCategories.SortOrder)选择类别,只需在OVER语句toTblProductXCategories.SortOrder中替换order by列即可。它可以很好地处理重复的排序器
with t as
(select TblProductXCategories.*,TblCategories.Name CatName,
row_number() over (partition by ProductID order by TblCategories.Sort) rownum
from TblProductXCategories
join TblCategories on TblProductXCategories.CategoryId = TblCategories.id
and TblCategories.Active=1
)
select TblProducts.SKU,TblProducts.Price,t.CatName,
(select top 1 AltName from TblAlternateCategoryName
where TblAlternateCategoryName.CategoryId=t.CategoryId order by Id )
from t
left join TblProducts on t.productid=TblProducts.id
where rownum=1
或同等产品,不带:
这是一本书。此查询选择最小的类别(TblCategory.Sort)。如果需要使用min(TblProductXCategories.SortOrder)选择类别,只需在OVER语句toTblProductXCategories.SortOrder中替换order by列即可。它可以很好地处理重复的排序器
with t as
(select TblProductXCategories.*,TblCategories.Name CatName,
row_number() over (partition by ProductID order by TblCategories.Sort) rownum
from TblProductXCategories
join TblCategories on TblProductXCategories.CategoryId = TblCategories.id
and TblCategories.Active=1
)
select TblProducts.SKU,TblProducts.Price,t.CatName,
(select top 1 AltName from TblAlternateCategoryName
where TblAlternateCategoryName.CategoryId=t.CategoryId order by Id )
from t
left join TblProducts on t.productid=TblProducts.id
where rownum=1
或同等产品,不带:
看起来像家庭作业?您尝试过什么?我在存储过程中有一个很长的SQL语句,但后来意识到,如果TblProductXCategories有2个相同的排序器,它将显示重复项。如果排序器为您生成重复项,则连接在错误的列上。看起来像家庭作业吗?你尝试过什么?我在一个存储过程中有一个很长的SQL语句,但后来意识到如果TblProductXCategories有2个相同的排序器,它将显示重复项。如果排序器为你生成重复项,则连接在错误的列上。这是我最初的做法,但问题是我在排序中有重复项。这是我最初拥有的,但问题是我在排序中有重复项。感谢您的回复,但我需要每个产品一个结果。需要选择一个备选名称。@monsey11我用两个备选名称编辑了我的答案,一个将连接备选类别,另一个将获得
max(altname)
。你需要决定用什么逻辑来决定你想要的替代类别名称谢谢你的回复,但我需要每个产品有一个结果。需要选择一个备选名称。@monsey11我用两个备选名称编辑了我的答案,一个将连接备选类别,另一个将获得max(altname)
。您需要决定使用何种逻辑来决定要使用的备用类别名称。这在SQLFiddle中起作用,但我需要看看如何将其合并到我拥有的庞大的SQL语句中。@monsey11:我在答案中添加了一个等价的查询,而没有WITH,因此您可以将其用作子查询。谢谢。这在SQLFiddle中起作用,但我需要看看如何将其合并到我拥有的庞大的SQL语句中。@monsey11:我在答案中添加了一个等价的查询,但没有WITH,因此您可以将其用作子查询。
select SKU, price, c.name
from (select P.SKU, p.price,
MIN(p.sort) as minsort
from tblProducts p join
tblProductXCategories pxc
on p.id = pxc.productid join
tblCategory c
on pxc.categoryid = c.categoryid and
active = 1
group by P.SKU, p.price
) p join
tblCategories c
on p.minsort = c.sort
select SKU, price, c.name
from (select P.SKU, p.price,
MIN(p.sort) as minsort
from tblProducts p join
tblProductXCategories pxc
on p.id = pxc.productid join
tblCategory c
on pxc.categoryid = c.categoryid and
active = 1
group by P.SKU, p.price
) p join
(select c.*,
row_number() over (partition by sort order by newid()) as seqnum
from tblCategories c
) c
on p.minsort = c.sort and
c.seqnum = 1
select x1.sku, x1.price, c.name, ac.altname
from
(
select x.sku, p.price, x.sort
from
(
select p.sku, min(c.sort) sort
from products p
left join ProductXCategories pxc
on p.id = pxc.productid
left join Categories c
on pxc.categoryid = c.id
group by p.sku
) x
inner join products p
on x.sku = p.sku
) x1
inner join categories c
on x1.sort = c.sort
left join AlternateCategoryName ac
on c.id = ac.categoryid
where c.active = 1
select distinct x1.sku,
x1.price,
c.name,
STUFF((SELECT ',' + ac.altname
FROM AlternateCategoryName ac
WHERE
c.id = ac.categoryid
FOR XML PATH('')
),1,1,'') altname
from
(
select x.sku,
p.price,
x.sort
from
(
select p.sku,
min(c.sort) sort
from products p
left join ProductXCategories pxc
on p.id = pxc.productid
left join Categories c
on pxc.categoryid = c.id
group by p.sku
) x
inner join products p
on x.sku = p.sku
) x1
inner join categories c
on x1.sort = c.sort
left join AlternateCategoryName ac
on c.id = ac.categoryid
where c.active = 1
select x1.sku,
x1.price,
c.name,
ac.altname
from
(
select x.sku,
p.price,
x.sort
from
(
select p.sku,
min(c.sort) sort
from products p
left join ProductXCategories pxc
on p.id = pxc.productid
left join Categories c
on pxc.categoryid = c.id
group by p.sku
) x
inner join products p
on x.sku = p.sku
) x1
left join categories c
on x1.sort = c.sort
left join
(
select categoryid, max(altname) altname
from AlternateCategoryName
group by categoryid
) ac
on c.id = ac.categoryid
where c.active = 1
with t as
(select TblProductXCategories.*,TblCategories.Name CatName,
row_number() over (partition by ProductID order by TblCategories.Sort) rownum
from TblProductXCategories
join TblCategories on TblProductXCategories.CategoryId = TblCategories.id
and TblCategories.Active=1
)
select TblProducts.SKU,TblProducts.Price,t.CatName,
(select top 1 AltName from TblAlternateCategoryName
where TblAlternateCategoryName.CategoryId=t.CategoryId order by Id )
from t
left join TblProducts on t.productid=TblProducts.id
where rownum=1
select TblProducts.SKU,TblProducts.Price,t.CatName,
(select top 1 AltName
from TblAlternateCategoryName
where TblAlternateCategoryName.CategoryId=t.CategoryId
order by Id ) AltCat
from
(select TblProductXCategories.*,
TblCategories.Name CatName,
row_number()
over (partition by ProductID order by TblCategories.Sort) rownum
from TblProductXCategories
join TblCategories on TblProductXCategories.CategoryId = TblCategories.id
and TblCategories.Active=1
) t
left join TblProducts on t.productid=TblProducts.id
where rownum=1