有没有办法在不指定列名的情况下对表的所有列进行分组?喜欢:
select * from table group by *
Answers:
SELECT DISTINCT * FROM MyFooTable;
如果按所有列分组,则只是在请求删除重复数据。
例如,包含以下数据的表:
id | value
----+----------------
1 | foo
2 | bar
1 | foo
3 | something else
如果执行以下查询,与SELECT * FROM MyFooTable GROUP BY *
假设*表示所有列基本上相同:
SELECT * FROM MyFooTable GROUP BY id, value;
id | value
----+----------------
1 | foo
3 | something else
2 | bar
它删除所有重复值,从本质上讲,其语义与使用DISTINCT关键字相同,但结果的顺序不同。例如:
SELECT DISTINCT * FROM MyFooTable;
id | value
----+----------------
1 | foo
2 | bar
3 | something else
他正在尝试查找并在表中显示重复的行。
SELECT *, COUNT(*) AS NoOfOccurrences
FROM TableName GROUP BY *
HAVING COUNT(*) > 1
我们有一个简单的方法来做到这一点吗?
否,因为这从根本上意味着您将不会进行任何分组。如果按所有列分组(并且具有正确定义的表且具有唯一索引),则SELECT * FROM table
本质上与相同SELECT * FROM table GROUP BY *
。
简短的回答:不。GROUP BY子句本质上要求按顺序排列结果。不同顺序的字段分组将导致不同的结果。
指定通配符将使语句易于解释和不可预测的行为。
这是我的建议:
DECLARE @FIELDS VARCHAR(MAX), @NUM INT
--DROP TABLE #FIELD_LIST
SET @NUM = 1
SET @FIELDS = ''
SELECT
'SEQ' = IDENTITY(int,1,1) ,
COLUMN_NAME
INTO #FIELD_LIST
FROM Req.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'new340B'
WHILE @NUM <= (SELECT COUNT(*) FROM #FIELD_LIST)
BEGIN
SET @FIELDS = @FIELDS + ',' + (SELECT COLUMN_NAME FROM #FIELD_LIST WHERE SEQ = @NUM)
SET @NUM = @NUM + 1
END
SET @FIELDS = RIGHT(@FIELDS,LEN(@FIELDS)-1)
EXEC('SELECT ' + @FIELDS + ', COUNT(*) AS QTY FROM [Req].[dbo].[new340B] GROUP BY ' + @FIELDS + ' HAVING COUNT(*) > 1 ')