所有列的SQL分组

63 sql

是否有任何方法可以在不指定列名的情况下对表的所有列进行分组?喜欢:

select * from table group by *
Run Code Online (Sandbox Code Playgroud)

Eli*_*jah 45

DISTINCT关键字


我相信你要做的是:

SELECT DISTINCT * FROM MyFooTable;
Run Code Online (Sandbox Code Playgroud)

如果按所有列分组,则只是请求删除重复数据.

例如,包含以下数据的表:

 id |     value      
----+----------------
  1 | foo
  2 | bar
  1 | foo
  3 | something else
Run Code Online (Sandbox Code Playgroud)

如果您执行以下查询,该查询基本上与SELECT * FROM MyFooTable GROUP BY *您假设*表示所有列的查询相同:

SELECT * FROM MyFooTable GROUP BY id, value;

 id |     value      
----+----------------
  1 | foo
  3 | something else
  2 | bar
Run Code Online (Sandbox Code Playgroud)

它会删除所有重复值,这实际上使其在语义上与使用DISTINCT关键字相同,但结果排序除外.例如:

SELECT DISTINCT * FROM MyFooTable;

 id |     value      
----+----------------
  1 | foo
  2 | bar
  3 | something else
Run Code Online (Sandbox Code Playgroud)


小智 13

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

SELECT *, COUNT(*) AS NoOfOccurrences
FROM TableName GROUP BY *
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

我们有一个简单的方法来实现这一目标吗?

  • 我在 postgreSQL 中收到 GROUP BY * 语法错误 (4认同)

mja*_*day 11

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

结果是

a b
1 1
1 2
Run Code Online (Sandbox Code Playgroud)


wom*_*omp 5

简短的回答:不。GROUP BY 子句本质上要求按顺序排列结果。不同的字段分组顺序会导致不同的结果。

指定通配符将使语句易于解释和不可预测的行为。

  • “开放解释” 这可以通过指定列的自然顺序(即它们定义的顺序)轻松解决。通配符语法将是一个有用的功能。 (2认同)

DFo*_*k42 5

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

;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
Run Code Online (Sandbox Code Playgroud)


Voj*_*ěch 5

我想对完整的结果集进行计数和求和。我用GROUP BY 1=1.

  • 我不知道这是如何工作的,但它非常棒,而且正是我所需要的。这个技巧是否记录在某处并且受到所有主要关系数据库的支持? (3认同)

jel*_*key 1

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

  • 当然,如果您“没有”唯一索引,则 SELECT * FROM table *与 SELECT * FROM table GROUP BY * 不同。在这种情况下,您可以使用 SELECT DISTINCT * FROM table 来完成此操作。 (26认同)
  • 拥有重复的行是继承项目时必须处理的常见问题 - 因此我认为假设有人永远不想删除重复的行是不安全的。 (9认同)
  • 还有另一种情况... SELECT t1.*,count(t2.items) FROM t1 LEFT JOIN t2 ON t1.id = t2.id GROUP BY t1.* (6认同)