2015-07-11 58 views
0

我有2个表TableATableB,这里是两个表SQL查询来合并基于序列行定义

OrderNumber LineSEQNo SequenceNumber CommentText 
2145106  0000000001  000   ABB - 
2145106  0000000001  001   2" AL. pole 7'8"  

而表B如下

SalesOrderNumber LineSEQNo  desc1   desc2 
     2145106   0000000001  ORDER DIDN't  NULL 
     2145106   0000000002  ABB    BCC          
     2145106   0000000003  NULL    Customer did NOT get any. 

的数据现在我想从TableB输出..我的意思是输出应与TableB相同。

  1. 将会有一个LineSEQNo(不同的)每行表
  2. TableB.LineSEQNo将检查TableALineSEQNo。如果它存在于TableA中,那么将显示该LineSEQNoSequenceNumber并且基于序列将CommentText合并成一行。
  3. 如果LineSEQNoTableA,然后desc1desc2存在将串联为LineSEQNo

所以输出应该是这样的:

2145106 0000000001  ABB - 2" AL. pole 7'8" 
2145106 0000000002  ABB BCC 
2145106 0000000003  Customer did NOT get any. 

希望我清楚。

现在的解决方案唯一的解决办法是,在我这种即将为WHILE环..

有没有其他办法可以没有环这个期望的结果?

回答

2

困难的部分是连接tablea的字符串。您可以在一个子查询做到这一点,然后用left join,并用coalesce()完成逻辑:

select b.*, 
     coalesce(a.commenttext, coalesce(desc1, '') + coalesce(desc2, '')  
from tableb b left join 
    (select a.ordernumber, a.lineseqno, 
      (select a2.commenttext as commenttext 
       from tablea a2 
       where a2.ordernumber = a.ordernumber and a2.lineseqno = a.lineseqno 
       for xml path (''), TYPE 
      ).value('.[1]', N'varchar(max)') as commenttext 
     from tablea a 
     group by a.ordernumber, a.lineseqno 
    ) a 
    on b.ordernumber = a.ordernumber and b.lineseqno = a.lineseqno; 

Here是一个SQL小提琴,显示的基本理念。

+0

谢谢你的帮助一切工作都很完美,除了TABLE A ..的文本已经与出现了,那么评论? – Mahajan344

+0

@spenzo。 。 。我修复了'for xml path()'。无可否认,我倾向于使用'('')'。但是,正确的方法是分配一个类型并获取值。请注意,如果这是你的字段的类型,你应该使用'nvarchar()'。这也可以防止诸如“&”被转入“&”之类的怪异情况。 –

+0

@Spenzo。 。 。如意编程造成的一个错误。我一直认为'TYPE'是'PATH'结构的一个“参数”。实际上,它是“FOR XML PATH”的修饰符。前者总是让我搞不清语法,直到我查找它,然后查找它,然后才正确。 –