我有一个不错的大小表,有20多列和近300万行,我想从单个列中选择所有唯一值并将它们输入到新创建的表中。经过研究,我尝试使用DISTINCT和GROUP BY方法,但两者都产生重复值。此外,我已将新表中的新列设置为主键,我认为不应允许重复值。
我绝对是初学者,所以也许有一些简单的我做错了。这是一些示例代码:
使用GROUP BY
INSERT INTO ResourceGroups(ResourceGroup)
SELECT ResourceGroup
FROM dbo.UsageData
WHERE ResourceGroup IS NOT NULL
GROUP BY ResourceGroup
使用DISTINCT
INSERT INTO ResourceGroups(ResourceGroup)
SELECT DISTINCT ResourceGroup
FROM dbo.UsageData
WHERE ResourceGroup IS NOT NULL
这两者的结果似乎都是一样的。以下是前几行的示例:
ResourceGroup
aiiInnovationTime
Api-Default-Central-US
Api-Default-Central-US
applicationinsights
applicationinsights
azurefunctions-southeastasia
azurefunctions-southeastasia
该查询产生了532行,并且在从300万行合并后明显消除了一些重复。但是,这里显然仍然存在重复,并且它们也成功插入到不应允许重复的主键列中。此外,尽管我试图过滤掉NULL,但仍然有一个空行(尽管可能有空格或其他东西?)。毋庸置疑,我对我做错了什么感到有点困惑,非常感谢这个社区可以提供的任何帮助!
答案 0 :(得分:0)
假设您的数据中有空格
SELECT DISTINCT
REPLACE(REPLACE(REPLACE(REPLACE(ResourceGroup, CHAR(13) + CHAR(10), ' ... '),
CHAR(10) + CHAR(13), ' ... '), CHAR(13), ' '), CHAR(10), ' ... ')
FROM dbo.UsageData
WHERE LTRIM(RTRIM(ResourceGroup)) IS NOT NULL
LTRIM修剪前导空格,RTRIM修剪尾随空格。尝试一下,看看它是否有效!
答案 1 :(得分:0)
你提到的两个查询都应该给你独特的结果,然而,异常是由于可能是前导或尾随空格。
根据数据库的不同,您可以修改例如
的查询 对于Oracle DB :您可以使用TRIM
函数删除前导和尾随空格。
SQL Server 不具备单一功能,您必须使用LTRIM
和RTRIM
删除空格。
答案 2 :(得分:-1)
正如Chetan Ranpariya提到的那样,检查了领先和尾随空格。你这样做的方式取决于SQL引擎。例如,在MySQL中,您可以使用https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim。