【问题标题】:ORACLE Select Distinct return many columns and whereORACLE Select Distinct 返回许多列和位置
【发布时间】:2014-03-13 18:35:06
【问题描述】:

我有一个如下所示的表格:

NAME    Col1     Col2    Col3
Tim     1        2       3
Tim     1        1       2
Tim     2        1       2
Dan     1        2       3
Dan     2        2       1
Dan     2        1       3

我正在尝试执行一个 SELECT 命令,结果如下:

NAME    Col1     Col2    Col3
Tim     2        1       2
Dan     2        2       1

所以我想要不同的名称,但选择所有四列,其中 Col1 = 2。 我在这里使用了解决方案来使不同的部分正常工作: SQL/mysql - Select distinct/UNIQUE but return all columns?

但是,当我在 select 语句的 WHERE 部分添加 add Col1 = '2' 时,不会返回 Col1 为 2 的所有名称,因为我认为它首先会看到一个不同的名称,而不是 1,所以会得到这个结果。

希望我说得通,有人可以提供帮助。很难解释并想出一个好的标题。谢谢!

【问题讨论】:

  • 您有两列 col1 = 2 和 Name = 'Dan' 但您没有指定如何选择显示哪一列... Dan 2 2 1 Dan 2 1 3跨度>
  • 不管是哪一个,只要它告诉我有一个 Col1 = 2 的 Dan 而不是得到 col1 = 1 的那个然后不显示 Dan。
  • 然后不要选择所有行,只需`select name,col1 from table1 where col1=2'
  • 这会给我 2 个 dans,因为有 2 个 col1 = 2。我只想要 1 个。
  • group by 仍然会给我 2 个 dans,因为我必须按所有选定的列(oracle)进行分组。

标签: sql oracle select


【解决方案1】:

如果只选择这 2 列(名称和 col1)就足够了,您可以使用:

select 
    distinct x.name, x.col1
  from table_name x
  where x.col1 = 2;

select 
    x.name, x.col1
  from table_name x
  where x.col1 = 2
  group by (x.name, x.col1);  

如果您需要所有值,但您不介意满足您的条件的多个记录中的哪一个(例如 Dan 2 2 1 或 Dan 2 1 3),您可以使用它(它将记录第一个基于按标准排序):

select xx.name, xx.col1, xx.col2, xx.col3
  from (select 
      x.name, x.col1, x.col2, x.col3, dense_rank() over (partition by x.name order by x.name, x.col1, x.col2, x.col3) rnk
    from table_name x
    where x.col1 = 2) xx
  where xx.rnk = 1;

【讨论】:

    【解决方案2】:

    据我了解,此查询应该可以解决您的问题:

    select distinct a.* from temp_ids a join
    
    (select name, max(col1 || ' ' || col2  || ' ' || col3) id
    from temp_ids
    where col1 = 2
    group by name
    ) b
    
    on (a.name = b.name and (col1 || ' ' || col2  || ' ' || col3) = b.id)
    ;
    

    当然,最好使用唯一的记录 id 而不是连接,但生成的 id 是可能的。确保 id 的函数为每个列组合返回唯一值(在这种情况下使用 (col1 || ' ' || col2 || ' ' || col3) )

    【讨论】:

    • 是的,我使用了一些非常相似但更简单的东西。 SELECT name, MAX(col1), MAX(col2), MAX(col2) FROM table WHERE col2 = '2' GROUP BY name ORDER by name
    • 是的,只有在需要从同一行中选择值时才需要唯一的行标识符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2012-10-07
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多