2015-07-11 57 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」的修飾符。前者總是讓我搞不清語法,直到我查找它,然後查找它,然後才正確。 –