SELECT DISTINCT不起作用

时间:2016-01-06 00:08:07

标签: sql oracle select distinct

假设我有一个表名TableA,其中包含以下部分数据:

LOOKUP_VALUE     LOOKUPS_CODE     LOOKUPS_ID
------------     ------------     ----------
          5%              120           1001
          5%              121           1002
          5%              123           1003
          2%              130           2001
          2%              131           2002

我想使用DISTINCT只选择1行5%和1行2%作为视图,但它失败了,我的查询是:

SELECT DISTINCT lookup_value, lookups_code
  FROM TableA;

以上查询给出了如下所示的结果。

LOOKUP_VALUE     LOOKUPS_CODE     
------------     ------------     
          5%              120           
          5%              121           
          5%              123           
          2%              130           
          2%              131           

但这不是我预期的结果,mt预期结果如下所示:

LOOKUP_VALUE     LOOKUPS_CODE     
------------     ------------     
          5%              120                                
          2%              130           

我可以知道如何在不指定任何WHERE子句的情况下实现此目的吗? 谢谢!

5 个答案:

答案 0 :(得分:5)

我认为你误解了DISTINCT的范围:它会给你不同的,而不仅仅是第一个字段的不同。

如果您想为每个不同的LOOKUP_VALUE添加一行,您需要一个WHERE子句来确定要显示哪一个,或者需要一个带有GROUP BY子句的聚合策略加上SELECT中的逻辑,告诉查询如何汇总其他列(例如AVGMAXMIN

答案 1 :(得分:3)

这是我对你的问题的猜测 - 当你说

  

"上面的查询给出了上面数据表中显示的结果。"

这是不正确的 - 请尝试并相应地更新您的问题。

我在这里猜测:我认为你正在尝试使用" Distinct"而且还输出其他字段。如果您运行:

select distinct Field1, Field2, Field3 ...

然后你的输出将是"每个不同的组合一行"三个领域。

尝试使用GROUP BY - 这将允许您选择其他字段的最大值,最小值,总和,同时仍然产生"每个唯一组合值一行#34;对于GROUP BY中包含的字段

下面的示例使用您的表为每个LOOKUP_VALUE返回一行,然后使用您的数据返回剩余字段的最大值和最小值以及总记录数:

select 
     LOOKUP_VALUE, min( LOOKUPS_CODE) LOOKUPS_CODE_min, max( LOOKUPS_CODE) LOOKUPS_CODE_max, min( LOOKUPS_ID) LOOKUPS_ID_min, max( LOOKUPS_ID) LOOKUPS_ID_max, Count(*) Record_Count 
From TableA
Group by LOOKUP_VALUE

答案 2 :(得分:1)

  

我想只选择1行5%和1行2%

这将获得每个lookups_code的最低值lookup_value

SELECT lookup_value,
       lookups_code
FROM   (
  SELECT lookup_value,
         lookups_code,
         ROW_NUMBER() OVER ( PARTITION BY lookup_value ORDER BY lookups_code ) AS rn
  FROM   TableA
)
WHERE  rn = 1

您也可以使用GROUP BY

SELECT   lookup_value,
         MIN( lookups_code ) AS lookups_code
FROM     TableA
GROUP BY lookup_value

答案 3 :(得分:0)

MIN()函数怎么样

我相信这适用于您想要的输出,但我目前无法测试它。

SELECT Lookup_Value, MIN(LOOKUPS_CODE) 
FROM TableA
GROUP BY Lookup_Value;

答案 4 :(得分:0)

我将在黑暗中完全拍摄,但由于你命名字段的方式,它暗示你试图模仿Microsoft Excel中的vlookup功能。如果是这种情况,则存在多个匹配时的行为是选择第一个匹配。听起来是随意的,它是它的工作方式。

如果这是您想要的,并且第一个值不一定是最低值(或最高,或最佳,或其他),那么row_number聚合函数可能会满足您的需求。

我告诉你一个警告,我的订购标准是基于数据库行号,这可能与你的想法不同。但是,如果您将它们插入干净的桌子(带有重置高水位标记),那么我认为这是一个非常安全的选择,它会按照您想要的方式运行。如果没有,那么最好明确地包括一个字段,告诉它你希望选择发生的顺序。

with cte as (
  select
    vlookup_value,
    vlookups_code,
    row_number() over (partition by vlookup_value order by rownum) as rn
  from
    TableA
)
select
  vlookup_value, vlookups_code
from cte
where rn = 1