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