2011-11-15 26 views
0

我正在从未规范化(并非我的选择)的表中读取内容,并试图将其中的字段映射到另一个表中。有没有办法在一次旅行中做到这一点?我正在使用Microsoft SQL。跨表格映射非规范化字段

TableA: 
ID 
FieldX1_ID (fixed set of fields that could have been better normalized) 
FieldX2_ID 
FieldX3_ID 

TableB: 
FieldX_ID (matches ID's in TableA's fields) 
FieldX_Value 

我想输出行是: TableA.ID,TableB.FieldX_Value为TableA.FieldX1_ID,TableB.FieldX_Value为TableA.FieldX2_ID,等...

回答

0

你可以得到的结果有两种方式。我不确定你的描述是哪一个。

若要将结果显示在一个标准化的方式(你三排):

SELECT TableA.FieldX1_ID AS ID, TableB.FieldX_Value 
    FROM TableA JOIN TableB ON TableA.FieldX1_ID = TableB.FieldX_ID 
UNION ALL 
SELECT TableA.FieldX2_ID AS ID, TableB.FieldX_Value 
    FROM TableA JOIN TableB ON TableA.FieldX2_ID = TableB.FieldX_ID 
UNION ALL 
SELECT TableA.FieldX3_ID AS ID, TableB.FieldX_Value 
    FROM TableA JOIN TableB ON TableA.FieldX2_ID = Table3.FieldX_ID 

若要将结果显示在非归一化的方式(你会得到一个行):

SELECT TableA.FieldX1_ID AS ID1, TableB.FieldX_Value AS Value1, 
     TableA.FieldX2_ID AS ID2, TB2.FieldX_Value AS Value2, 
     TableA.FieldX3_ID AS ID3, TB3.FieldX_Value AS Value3, 
    FROM TableA JOIN TableB ON TableA.FieldX1_ID = TableB.FieldX_ID 
       JOIN TableB AS TB2 ON TableA.FieldX2_ID = TB2.FieldX_ID 
       JOIN TableB AS TB3 ON TableA.FieldX3_ID = TB3.FieldX_ID 
0

是的,你可以做这通过多次连接表A和B(对于表A中的每个列需要加入一次)。

例如:

SELECT 
    A.ID 
, FieldX1_Value = B1.FieldX_Value 
, FieldX2_Value = B2.FieldX_Value 
, FieldX3_Value = B3.FieldX_Value 
FROM A 
LEFT JOIN B B1 
    ON A.FieldX1_ID = B1.FieldX_ID 
LEFT JOIN B B2 
    ON A.FieldX2_ID = B2.FieldX_ID 
LEFT JOIN B B3 
    ON A.FieldX3_ID = B3.FieldX_ID