【问题标题】:how to combine these 2 queries to 1?如何将这 2 个查询组合为 1 个?
【发布时间】:2014-03-03 19:33:10
【问题描述】:

我想添加一个逗号分隔的列,其中包含该产品的产品类别名称列表。这是我的数据模型:

我在此查询中获得了所有产品详细信息:

select d.name as 'Dealer Name',c.commissionamount as 'Commission Amount',c.createddate as 'Commission Created Date' ,p.name as 'Product Name'
from commission c
join dealer d 
on d.dealerid=c.dealerid
join product p on c.productid=p.productid
join productcategorymapping pcm on p.ProductId=pcm.ProductId
join ProductCategory pc on pc.ProductCategoryId=pcm.ProductCategoryId

我只是想用这个查询为每个产品添加 csv 列,我只是不知道如何加入 2:

select stuff((
SELECT ',' + pc.Name
FROM ProductCategory pc
join ProductCategoryMapping pcm on pcm.ProductCategoryId=pc.ProductCategoryId
join Product p1 on p1.ProductId=pcm.ProductId
and p1.ProductId=1
FOR XML PATH('')),1,1,'');

它说 productId=1 但这是它需要加入到其他查询的地方。 所以结果会是这样的:

DealerName  | Amount |date|product Name|csv
TestDealer1 | 105.25 |..  |ProdA       |CatA,CatC,CatF

我还为此创建了一个 sqlfiddle:http://sqlfiddle.com/#!6/d574e/4

【问题讨论】:

  • +1 一个很好的问题以及 sql fiddle。

标签: sql sql-server


【解决方案1】:

试试这个..

select
       d.name             AS [Dealer Name]
      ,c.commissionamount AS [Commission Amount]
      ,c.createddate      AS [Commission Created Date] 
      ,p.name             AS [Product Name]
      ,stuff((SELECT ', ' + pcci.Name
              FROM ProductCategory pcci
              join ProductCategoryMapping pcmi 
              on pcmi.ProductCategoryId=pcci.ProductCategoryId
              join Product p1i 
              on p1i.ProductId=pcmi.ProductId
              WHERE p1i.ProductId = p.productid
              FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,2,'')
                           AS [CSV]

from commission c join dealer d 
on d.dealerid=c.dealerid
join product p 
on c.productid=p.productid;

Working SQL FIDDLE

【讨论】:

  • 这会返回testdealer1 3次,看fiddle中最上面的查询
  • @user603007 现在看看我已经更新了我的答案。
  • M.ALi 感谢您的回答,您认为此模式的数据库设计是否针对性能进行了优化?哪里可以改?
  • @user603007 如果不了解有关数据库、应用程序要求等的全部内容,很难说设计是否适合性能。只需阅读有关数据库的规范化规则和尝试使您的数据库至少达到第 3 范式。乍一看,它看起来不错。数据库的性能取决于许多因素,数据库设计只是其中之一。无论如何,如果答案对您有帮助,请接受。祝你好运。
【解决方案2】:

只需在 Select 语句中将两者结合起来即可:

select DISTINCT d.name as 'Dealer Name',
c.commissionamount as 'Commission Amount',
c.createddate as 'Commission Created Date' ,
p.name as 'Product Name',
stuff((
SELECT ',' + pc.Name
FROM ProductCategory pc
join ProductCategoryMapping pcm on pcm.ProductCategoryId=pc.ProductCategoryId
join Product p1 on p1.ProductId=pcm.ProductId
and p1.ProductId=1
FOR XML PATH('')),1,1,'') as reqCol
from commission c
join dealer d 
on d.dealerid=c.dealerid
join product p 
on c.productid=p.productid
join productcategorymapping pcm 
on p.ProductId=pcm.ProductId
join ProductCategory pc 
on pc.ProductCategoryId=pcm.ProductCategoryId;

查看http://sqlfiddle.com/#!6/d574e/12

【讨论】:

  • TestDealer2 的 ReqCol 值不应该是 CatB 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多