SELECT DISTINCT field1, field2, field3, ......
FROM table;

我试图完成以下SQL语句,但我希望它返回所有列。 这可能吗?

就像这样:

SELECT DISTINCT field1, * 
FROM table;

当前回答

您正在寻找一个由:

select *
from table
group by field1

偶尔也可以用不同的on语句来写:

select distinct on field1 *
from table

然而,在大多数平台上,上述两种方法都不能工作,因为其他列上的行为未指定。(第一种方法适用于MySQL,如果你使用的是MySQL的话。)

您可以获取不同的字段,并坚持每次选择任意一行。

在一些平台上(例如PostgreSQL, Oracle, T-SQL),这可以直接使用窗口函数完成:

select *
from (
   select *,
          row_number() over (partition by field1 order by field2) as row_number
   from table
   ) as rows
where row_number = 1

在其他(MySQL, SQLite)上,您需要编写子查询,使您将整个表与其本身连接起来(示例),所以不推荐。

其他回答

对于SQL Server,您可以使用dense_rank和其他窗口函数来获取指定列上具有重复值的所有行和列。这里有一个例子……

with t as (
    select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r1' union all
    select col1 = 'c', col2 = 'b', col3 = 'a', other = 'r2' union all
    select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r3' union all
    select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r4' union all
    select col1 = 'c', col2 = 'b', col3 = 'a', other = 'r5' union all
    select col1 = 'a', col2 = 'a', col3 = 'a', other = 'r6'
), tdr as (
    select 
        *, 
        total_dr_rows = count(*) over(partition by dr)
    from (
        select 
            *, 
            dr = dense_rank() over(order by col1, col2, col3),
            dr_rn = row_number() over(partition by col1, col2, col3 order by other)
        from 
            t
    ) x
)

select * from tdr where total_dr_rows > 1

这是对col1、col2和col3的每个不同组合进行行计数。

这样只需要1个查询就可以得到2个唯一的列 select Distinct col1,col2 from '{path}' group by col1,col2 如果需要,可以增加列

从您的问题措辞中,我了解到您希望为给定字段选择不同的值,并为每个这样的值列出同一行中的所有其他列值。大多数dbms不允许使用DISTINCT或GROUP BY,因为结果是不确定的。

可以这样想:如果field1出现了不止一次,那么将列出field2的值(假设在两行中field1的值相同,但在这两行中field2的值不同)。

然而,你可以使用聚合函数(显式地为你想要显示的每个字段),并使用GROUP BY而不是DISTINCT:

SELECT field1, MAX(field2), COUNT(field3), SUM(field4), ....
FROM table GROUP BY field1
select min(table.id), table.column1
from table 
group by table.column1

只需将所有字段包含在GROUP BY子句中。