如何将所有列合并为一列

时间:2012-08-06 16:18:58

标签: sql-server tsql

我已经将三个表合并到一个表中,我注意到每个合并表都有类似的数据列,可以产生冗余。

将所有这些列更新为一列的最佳方法是什么?

现在数据将会读取

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]

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 - 每行
  3. 干杯

答案 2 :(得分:0)

在int类型的列上创建,并使用按位运算存储/读取/更新数据。例如,第一位用于col1,第二位用于col2,第三位用于col3等(假设每列只有两种可能性)。