2017-04-05 52 views
2

我正在获取具有以下格式的数据文件。我必须得到一个储存有物品描述的表格。如何在我的TSQL中替换union ALL

我正在寻找与CategoryID,商品代码和商品描述的输出。由于所有项目的数据都在相同的行中,因此类别变得有点棘手。

CategoryID Name ItemCode1 ItemCode2 ItemCode3 ItemCode4 ItemCode5 
    1  Test1 1234578  87BA1234     ERR12345 
    2  Test2 BAAA9AAJ    143PAAM 

ItemDescription存储如下:

Itemcode  ItemDesc 
12345678  Item1 
87BA1234  Item2 
and so on 

我能够通过分别选择每个项目,说明得到我想要的输出,并与工会一切束缚他们。但我觉得应该有更好的方法来做到这一点。感谢您的指导。

编辑:我的T-SQL与UNION ALL

SELECT CategoryID, isnull(Item.ItemDescription, 'Unknown') as ItemDesc 
      FROM 
      (
       SELECT CategoryID, ItemCode1 as code 
       FROM ItemDesc 
       UNION ALL  --AAAE9AAF 
       SELECT CategoryID, ItemCode2 as code 
       FROM ItemDesc 
       UNION ALL  --AAAG9AAF 
       SELECT CategoryID, ItemCode3 as code 
       FROM ItemDesc 
       UNION ALL  
       SELECT CategoryID, ItemCode4 as code 
       FROM ItemDesc 
       UNION ALL  
       SELECT CategoryID, ItemCode5 as code 
       FROM ItemDesc 
      )tc 
      LEFT JOIN @ItemDescription Item ON Item.ItemCode = tc.code 
+0

你是否介意发布你的查询。 –

+0

你能告诉我们你正在运行的实际t-sql命令,它里面有联合吗?也许这只是我,但你的描述没有太多意义。你是说item_description在另一个表中吗? categoryID是外键还是外键的一部分?基本上我要求更多的解释。谢谢。 –

+0

其中是您的输出中的“description”。请提供样本数据和预期产出。 – Utsav

回答

5

如果我的理解对不对,你想UNPIVOT您的数据。

尝试使用CROSS APPLY

select 
    t.categoryId, 
    x.itemcode, 
    d.itemDesc 
from your_table t 
cross apply (
    values (t.itemcode1),(t.itemcode2),(t.itemcode3), 
      (t.itemcode4),(t.itemcode5) 
    ) x (itemcode) 
join ItemDescription d on x.itemcode = d.itemcode; 
+0

这应该工作。但是OP需要在做出改变之前先检查两件事情,首先它返回相同的结果,其次它表现得比原始更好或更好。这些都是您在使用其他方法重写某些内容时需要做的事情。 – HLGEM

+0

@GurV这工作。非常感谢你! – Ramya

2

使用cross apply()values()

select 
    t.CategoryId 
    , t.Name 
    , v.ItemCode 
from t 
cross apply (values (ItemCode1), (ItemCode2), (ItemCode3), (ItemCode4), (ItemCode5) 
) v (ItemCode) 
where isnull(ItemCode,'') <> '' 

rextester演示:http://rextester.com/TFPP48713

回报:

+------------+-------+----------+ 
| CategoryId | Name | ItemCode | 
+------------+-------+----------+ 
|   1 | Test1 | 1234578 | 
|   1 | Test1 | 87BA1234 | 
|   1 | Test1 | ERR12345 | 
|   2 | Test2 | BAAA9AAJ | 
|   2 | Test2 | 143PAAM | 
+------------+-------+----------+ 
+0

感谢您的快速回复。如果我能接受这两个答案,我也可以接受这个答案。对不起! – Ramya

+0

@Ramya不用担心,乐意帮忙! – SqlZim