admin

选择唯一身份,然后选择双打之一

sql

我有一个包含A,B和C列的表。A列可能有重复项。

我需要一个查询,该查询将为我提供一个在A列中具有唯一值的结果集,并且我不在乎它需要哪种重复。

我对其余数据一无所知。

一个示例可能是:

A    B    C
1    8    8
1    7    7
2    10   10

在这种情况下,我想选择:

A    B    C
1    x    x
2    10   10

x =选择哪个值无关紧要。

亲切的问候,

马蒂亚斯·万斯(Matthias Vance)

编辑

我以为我找到了解决方案:

SELECT * FROM (
   SELECT * FROM test GROUP BY a
) table_test;

但这毕竟没有用。

这将导致:

[Microsoft][ODBC Excel Driver] Cannot group on fields selected with '*'

阅读 191

收藏
2021-07-01

共1个答案

admin

试试这个:

select A, B, C
from test x
where not exists (select *
                  from test y
                  where y.A = x.A
                        and (y.B < x.B or (y.B = x.B and y.C < x.C))
order by A

但是由于它包含相关的子查询,因此它可能很慢。(OTOH,从理论上讲,数据库引擎至少有可能将其优化为我在下面显示的内容。)


SQL之外的东西呢?您将如何处理结果?

如果要使用某些程序来处理它,为什么不这样做:

select A, B, C from test order by A, B, C

然后执行以下操作:

prev_a = None
for a, b, c in get_query_result():
    if a != prev_a:
        prev_a = a
        yield (a, b, c)

在您的应用程序中?

我不知道PHP,但是我想它应该是这样的:

$query = "SELECT a,b,c FROM test ORDER BY a,b,c";
$result = odbc_exec($connect, $query);
$prev_a = NULL;  # I don't know what you would normally use here in PHP
while (odbc_fetch_row($result)) {
  $a = odbc_result($result, 1);
  if (is_null($prev_a) or $a != $prev_a) { 
    $b = odbc_result($result, 2);
    $c = odbc_result($result, 3);
    print("A = $a, B = $b, C = $c\n");
    $prev_a = $a;
  }
}
2021-07-01