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]
4

3 回答 3

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
于 2012-08-06T16:38:05.127 回答
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 --对于每一行

干杯

于 2012-08-06T16:25:36.797 回答
0

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

于 2012-08-06T16:26:11.820 回答