【问题标题】:Oracle - SQL Distinct Select on aliased columnsOracle - 别名列上的 SQL 不同选择
【发布时间】:2013-07-31 17:14:40
【问题描述】:

我正在选择具有别名的列,例如:

select t.name, t.surname from table t where some conditions...;

现在我想在特定列上添加 distinct 函数。所以,如果我选择这个没有别名,它看起来像:

select distinct(name), surname from table;

但是如果我想用 ALIASED 列名编写选择查询呢?

select distinct(t.name) 不起作用,select t.distinct(name) 也不起作用。

【问题讨论】:

  • 您不能在特定列上使用 distinct。 distinct 始终应用于整行。您能否为期望的结果举例说明您要达到的目标
  • 它是别名的事实是无关紧要的。 select distinct(t.name) 'works' 但括号是多余的,它与select distinct t.name 相同。如果查询没有给出您预期的结果,或者给出了错误,您需要提供更多详细信息,或许可以提供更具体的示例。

标签: sql oracle select distinct alias


【解决方案1】:

SELECT 子句的第一列使用DISTINCT 关键字。例如,下面的代码适用于我们想要在特定列上应用 DISTINCT 的情况。在第一种情况下,特定列是 NAME,在后一种情况下,特定列是 SURNAME。

SELECT DISTINCT(T.NAME), T.SURNAME FROM TABLE T WHERE ...;
SELECT DISTINCT(T.SURNAME), T.NAME FROM TABLE T WHERE ...;

如果您希望在两个列上应用 DISTINCT,请使用以下技术:

SELECT DISTINCT(T.NAME), T.SURNAME FROM (
  SELECT DISTINCT(T.SURNAME), T.NAME FROM TABLE T WHERE ...;
) T

【讨论】:

  • Distinct 始终应用于列表中的所有表达式 as the documentation says。您的所有三个查询都将给出相同的结果,而第三个查询只是进行了不必要的子选择和额外的排序......
  • 是的,绝对正确,所有三个查询都会给出相同的结果。我将重点放在别名列上使用 DISTINCT 关键字。
【解决方案2】:

如何在 ALIASED 列名上编写选择查询?

您不能在别名列名上编写选择查询。

别名可用于以下方面:

  1. 一个查询涉及多个表
  2. 查询中使用了函数
  3. 列名太大或不太可读
  4. 两列或多列合并在一起

【讨论】:

  • 我不确定“在别名列上选择查询”是什么意思...您可以为列加上别名,正如您所说并且 OP 已经在做。你能解释一下你的意思吗?
  • 是的,这实际上并不准确,但由于 -1 代表成本,我不想投反对票
【解决方案3】:

distinct 不是函数,它是clause in the select statement

如果您希望数据库只返回一个,请指定 DISTINCT 或 UNIQUE 选择的每组重复行的副本。这两个关键词是 同义词。重复的行是那些每个都有匹配值的行 选择列表中的表达式。

您不能将distinct 应用于查询中的单个表达式(列),只能应用于整行。

目前还不清楚您希望在结果集中包含什么。您是在暗示您有相同的 name 和多个 surname 值;如果您只显示每个name,则需要确定要显示哪个surname(和其他字段)。一种选择是分组并选择最小值或最大值:

select t.name, min(t.surname)
from table t
where ...
group by t.name;

如果您的实际查询中有多个列,则分析 row_numberdense_rank 可能更合适,或者有 keep 子句。不过,这取决于您要做什么。

或者如果您想要name 字段并且现在根本不显示surname,那么只需:

select distinct t.name
from table t
where ... ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多