SQL: 删除具有不同名称的相同列
SQL: Deleting Identical Columns With Different Names
我正在使用 Netezza SQL。我原来的 table ("original_table") 看起来像这样(包含数字和字符变量):
age height height2 gender gender2
1 18 76.1 76.1 M M
2 19 77.0 77.0 F F
3 20 78.1 78.1 M M
4 21 78.2 78.2 M M
5 22 78.8 78.8 F F
6 23 79.7 79.7 F F
我想从此 table 中删除具有相同条目但名称不同的列。最后,这应该是这样的 ("new_table"):
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
我的问题: SQL 中是否有标准方法可以做到这一点?我尝试做一些研究并发现了以下 link :How do I compare two columns for equality in SQL Server?
到目前为止我尝试了什么: 看起来像这样的东西可能会起作用:
CREATE TABLE new_table AS SELECT * FROM original_table;
ALTER TABLE new_table
ADD does_age_equal_height varchar(255);
UPDATE new_table
SET does_age_equal_height = CASE
WHEN age = height THEN '1' ELSE '0' END AS does_age_equal_height;
从这里开始,如果“does_age_equal_height”列中所有值的“总和”等于“new_table”中的行数(即 select count(rownum) from new_table
)- 这必须意味着两列相等,并且可以删除其中一列。
但是,这是一种非常低效的方法,即使对于具有少量列的 tables 也是如此。在我的示例中,我有 5 列 - 这意味着我必须重复上述过程“5C2”次,即 5 次! / (2!*3!) = 10 次。例如:
ALTER TABLE employees
ADD does_age_equal_height varchar(255),
does_age_equal_height2 varchar(255)
does_age_equal_gender varchar(255)
does_age_equal_gender2 varchar(255)
does_height_equal_height2 varchar(255)
does_height_equal_gender varchar(255)
does_height_equal_gender2 varchar(255)
does_height2_equal_gender varchar(255)
does_height2_equal_gender2 varchar(255)
does_gender_equal_gender2 varchar(255);
随后会出现多个 CASE 语句 - 使过程进一步复杂化。
有人可以告诉我更有效的方法吗?
谢谢!
我希望以正确的方式解决你的问题。这是我在SqlServer中的代码来处理它,你应该根据Netezza自定义它SQL。
我的想法是:
计算每一列的MD5,然后将这些列放在一起进行比较,如果哈希值相同,则选择其中一列。
我要为这个问题创建以下 table:
CREATE TABLE Students
(
Id INT PRIMARY KEY IDENTITY,
StudentName VARCHAR (50),
Course VARCHAR (50),
Score INT,
lastName VARCHAR (50) -- another alias for StudentName ,
metric INT, -- another alias for score
className VARCHAR(50) -- another alias for Course
)
GO
INSERT INTO Students VALUES ('Sally', 'English', 95, 'Sally', 95, 'English');
INSERT INTO Students VALUES ('Sally', 'History', 82, 'Sally', 82, 'History');
INSERT INTO Students VALUES ('Edward', 'English', 45, 'Edward', 45, 'English');
INSERT INTO Students VALUES ('Edward', 'History', 78, 'Edward', 78, 'History');
创建 table 并插入示例记录后,它会转而查找相似的列。
步骤 1. 声明变量。
DECLARE @cols_q VARCHAR(max),
@cols VARCHAR(max),
@table_name VARCHAR(max)= N'Students',
@res NVARCHAR(max),
@newCols VARCHAR(max),
@finalResQuery VARCHAR(max);
第 2 步。生成动态查询以计算每列的哈希值。
SELECT @cols_q = COALESCE(@cols_q+ ', ','')+'HASHBYTES(''MD5'', CONVERT(varbinary(max), (select '+ COLumn_NAME +' as t from Students FOR XML AUTO))) as '+ COLumn_NAME,
@cols = coalesce(@cols + ',','')+COLumn_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name;
set @cols_q = 'select '+ @cols_q +' into ##tmp_'+ @table_name+' from '+ @table_name;
第 3 步。运行 生成查询。
exec(@cols_q)
第 4 步。获取删除了重复列的列。
set @res = N'select uniq_colname into ##temp_colnames
from(
select max(colname) as uniq_colname from (
select * from ##tmp_Students
)tt
unpivot (
md5_hash for colname in ( '+ @cols +')
) as tbl
group by md5_hash
)tr';
exec ( @res);
第 5 步。获得最终结果
select @newCols = COALESCE(@newCols+ ', ','')+ uniq_colname from ##temp_colnames
set @finalResQuery = 'select '+ @newCols +' from '+ @table_name;
exec (@finalResQuery)
我正在使用 Netezza SQL。我原来的 table ("original_table") 看起来像这样(包含数字和字符变量):
age height height2 gender gender2
1 18 76.1 76.1 M M
2 19 77.0 77.0 F F
3 20 78.1 78.1 M M
4 21 78.2 78.2 M M
5 22 78.8 78.8 F F
6 23 79.7 79.7 F F
我想从此 table 中删除具有相同条目但名称不同的列。最后,这应该是这样的 ("new_table"):
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
我的问题: SQL 中是否有标准方法可以做到这一点?我尝试做一些研究并发现了以下 link :How do I compare two columns for equality in SQL Server?
到目前为止我尝试了什么: 看起来像这样的东西可能会起作用:
CREATE TABLE new_table AS SELECT * FROM original_table;
ALTER TABLE new_table
ADD does_age_equal_height varchar(255);
UPDATE new_table
SET does_age_equal_height = CASE
WHEN age = height THEN '1' ELSE '0' END AS does_age_equal_height;
从这里开始,如果“does_age_equal_height”列中所有值的“总和”等于“new_table”中的行数(即 select count(rownum) from new_table
)- 这必须意味着两列相等,并且可以删除其中一列。
但是,这是一种非常低效的方法,即使对于具有少量列的 tables 也是如此。在我的示例中,我有 5 列 - 这意味着我必须重复上述过程“5C2”次,即 5 次! / (2!*3!) = 10 次。例如:
ALTER TABLE employees
ADD does_age_equal_height varchar(255),
does_age_equal_height2 varchar(255)
does_age_equal_gender varchar(255)
does_age_equal_gender2 varchar(255)
does_height_equal_height2 varchar(255)
does_height_equal_gender varchar(255)
does_height_equal_gender2 varchar(255)
does_height2_equal_gender varchar(255)
does_height2_equal_gender2 varchar(255)
does_gender_equal_gender2 varchar(255);
随后会出现多个 CASE 语句 - 使过程进一步复杂化。
有人可以告诉我更有效的方法吗?
谢谢!
我希望以正确的方式解决你的问题。这是我在SqlServer中的代码来处理它,你应该根据Netezza自定义它SQL。
我的想法是:
计算每一列的MD5,然后将这些列放在一起进行比较,如果哈希值相同,则选择其中一列。
我要为这个问题创建以下 table:
CREATE TABLE Students
(
Id INT PRIMARY KEY IDENTITY,
StudentName VARCHAR (50),
Course VARCHAR (50),
Score INT,
lastName VARCHAR (50) -- another alias for StudentName ,
metric INT, -- another alias for score
className VARCHAR(50) -- another alias for Course
)
GO
INSERT INTO Students VALUES ('Sally', 'English', 95, 'Sally', 95, 'English');
INSERT INTO Students VALUES ('Sally', 'History', 82, 'Sally', 82, 'History');
INSERT INTO Students VALUES ('Edward', 'English', 45, 'Edward', 45, 'English');
INSERT INTO Students VALUES ('Edward', 'History', 78, 'Edward', 78, 'History');
创建 table 并插入示例记录后,它会转而查找相似的列。
步骤 1. 声明变量。
DECLARE @cols_q VARCHAR(max),
@cols VARCHAR(max),
@table_name VARCHAR(max)= N'Students',
@res NVARCHAR(max),
@newCols VARCHAR(max),
@finalResQuery VARCHAR(max);
第 2 步。生成动态查询以计算每列的哈希值。
SELECT @cols_q = COALESCE(@cols_q+ ', ','')+'HASHBYTES(''MD5'', CONVERT(varbinary(max), (select '+ COLumn_NAME +' as t from Students FOR XML AUTO))) as '+ COLumn_NAME,
@cols = coalesce(@cols + ',','')+COLumn_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name;
set @cols_q = 'select '+ @cols_q +' into ##tmp_'+ @table_name+' from '+ @table_name;
第 3 步。运行 生成查询。
exec(@cols_q)
第 4 步。获取删除了重复列的列。
set @res = N'select uniq_colname into ##temp_colnames
from(
select max(colname) as uniq_colname from (
select * from ##tmp_Students
)tt
unpivot (
md5_hash for colname in ( '+ @cols +')
) as tbl
group by md5_hash
)tr';
exec ( @res);
第 5 步。获得最终结果
select @newCols = COALESCE(@newCols+ ', ','')+ uniq_colname from ##temp_colnames
set @finalResQuery = 'select '+ @newCols +' from '+ @table_name;
exec (@finalResQuery)