2012-08-06 52 views
0

我已經將三個表合併到一個表中,並且我注意到每個合併表都有類似的數據列產生冗餘。如何將所有列合併到一列

將所有這些列更新爲一列的最佳方法是什麼?

眼下的數據讀取

WallJambHeadCut | WallJambSillCut | DoorJambSillCut | DoorJambHeadCut | ect .... 
     1    0    0     0 
     0    0    1     0 

上述需要太兩列被冷凝下來:

Headcut | SillCut 

換句話說,這些列的每一個可以濃縮成一個。我只是想確保我寫出正確的更新聲明,因爲我會討厭插口我的數據了。

CREATE TABLE [dbo].[Table_1](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [WallJambHeadCut] [bit] NOT NULL, 
    [WallJambSillCut] [bit] NOT NULL, 
    [DoorJambSillCut] [bit] NOT NULL, 
    [DoorJambHeadCut] [bit] NOT NULL, 
    [VerticalHeadCut] [bit] NOT NULL, 
    [VerticalSillCut] [bit] NOT NULL, 
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

回答

0

根據您想要執行的複雜性,您可以將所有列替換爲tinyint類型的列,並執行按位操作來處理數據。實際上,我們正在開展這個項目。

你給的例子中,你將有

0000 1000 --Which is 8 
0000 0010 --Which is 2 

每當你需要更新這些值,你只需要使用運營商。

您可以點擊這裏http://msdn.microsoft.com/en-us/library/ms176122.aspx

的TINYINT是更好,因爲它只佔8位

  1. 添加新列
  2. 更新表,並設置NEWCOL = WallJambHeadCut更多信息| WallJambSillCut | DoorJambSillCut | DoorJambHeadCut──爲每一行

乾杯

+0

我甚至沒有想過oRing ......謝謝大家。 – 2012-08-06 17:08:49

0

創建的類型爲int的列,並使用位運算存儲/讀取/更新數據。例如,對col1使用第一位,對col2使用第二位,對col3使用第三位等等(假設對於每列只有兩種可能性)。

1

你能從這個查詢中得到你想要的嗎?

select Headcut,Sillcut from (
select [WallJambHeadCut] as Headcut,[WallJambSillCut] as Sillcut from table_1 
union all 
select [DoorJambHeadCut] as Headcut,[DoorJambSillCut] as Sillcut from table_1 
union all 
select [VerticalHeadCut] as Headcut),[VerticalSillCut] as Sillcut from table_1 
) a