【发布时间】:2022-01-15 09:07:10
【问题描述】:
我正在使用 Netezza SQL。我的原始表(“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
我想从该表中删除具有相同条目但名称不同的列。最后,这应该是这样的(“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 中是否有标准的方法来执行此操作?我试图做一些研究,发现了以下链接: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) - 这必须意味着两列相等,并且其中之一可以删除列。
但是,这是一种非常低效的方法,即使对于具有少量列的表也是如此。在我的示例中,我有 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 语句 - 使过程更加复杂。
有人可以告诉我一个更有效的方法吗?
谢谢!
【问题讨论】:
-
我很困惑 - 为什么需要比较所有列组合?您不能只检查明显重复的那些(例如,您的示例中的 height 和 height2 吗?粗略检查前几行应该足以识别可能要检查的候选人,只有 5 列。
-
@APH:谢谢你的回复!在我的真实表中有数百列和数千行。因此,我认为不可能进行粗略的检查。谢谢!
-
对于重复的列,你应该考虑多列的值,如果我错了,请纠正我。
-
@Farshid Shekari:谢谢你的回复!我认为您需要考虑所有列值?谢谢!
-
如果表中有两列有 10,000 行或 100 万行,并且除了 1 行之外所有列都相同,这意味着您为了 1 行而保留两列?这似乎是一种奇怪的情况。
标签: sql duplicates case alter