SQL按所有列分组

有什么办法可以将一个表的所有列分组而不指定列名? 喜欢:

select * from table group by * 

DISTINCT关键字

我相信你想要做的是:

 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关键字相同,除了结果sorting之外。 例如:

SELECT DISTINCT * FROM MyFooTable;

  id | value ----+---------------- 1 | foo 2 | bar 3 | something else 

如果你使用SqlServer,distinct关键字应该适合你。 (不知道其他数据库)

 declare @t table (a int , b int) insert into @t (a,b) select 1, 1 insert into @t (a,b) select 1, 2 insert into @t (a,b) select 1, 1 select distinct * from @t 

结果是

 ab 1 1 1 2 

他正在尝试查找并在表格中显示重复的行。

 SELECT *, COUNT(*) AS NoOfOccurrences FROM TableName GROUP BY * HAVING COUNT(*) > 1 

我们有一个简单的方法来完成这个吗?

不,因为这从根本上意味着你不会分组任何东西。 如果按照所有列进行分组(并且具有正确定义的表,并具有唯一索引),那么SELECT * FROM table基本上与SELECT * FROM table GROUP BY *

不。 你想要做一些聚合吗? 如果是这样,你可以做这样的事情来得到你所需要的

 ;with a as ( select sum(IntField) as Total from Table group by CharField ) select *, a.Total from Table t inner join a on t.Field=a.Field 

简短的回答:不。 GROUP BY子句本质上要求他们安排你的结果的方式。 字段分组的顺序不同会导致不同的结果。

指定一个通配符会使语句对解释和不可预知的行为开放。

您可以使用Group by All,但要小心,因为Group by All将从SQL Server的未来版本中删除。

我想做完整的结果集计数和总和。 我通过GROUP BY 1=1实现了所有分组。

这是我的build议:

 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 ')