Oracle SQL选择不同

时间:2013-02-11 04:17:57

标签: sql oracle

我有一个样本表如下。

ID     Name            Code     Address
----+---------------+--------+----------------
1   |  Sydney Hall  |  SH    |  11 Abc Street
2   |  Sydney Hall  |  SH    |  23 Abc Street
3   |  Main Hall    |  MH    |  74 Xyz Street
4   |  Odyssey Hall |  OH    |  133 AbZ Street
5   |  Odyssey Hall |  OH    |  28 Xyx Street

我想为这些不同的条目选择不同的代码条目以及ID和名称。对于上表,我想得到以下内容(所以我忽略了建筑地址)。

ID     Name            Code   
----+---------------+--------+
1   |  Sydney Hall  |  SH
3   |  Main Hall    |  MH
4   |  Odyssey Hall |  OH

它可能是一个左连接,但我似乎无法将它正确地放在一起(特别是因为我从同一个表中选择数据)。有没有人对此有所了解? 感谢。

5 个答案:

答案 0 :(得分:4)

我看到每个人都已经回答了这个问题,但为什么这么复杂呢?

SELECT 
MIN(ID) ID, 
MIN(NAME) NAME, 
CODE 
FROM TABLE 
GROUP BY CODE

答案 1 :(得分:2)

SELECT * 
FROM [table_1] 
WHERE [ID] IN (SELECT Min([ID]) 
               FROM [table_1] 
               GROUP BY CODE
              )

答案 2 :(得分:2)

我有两种方法可以做到这一点。一种是使用FIRST聚合函数(documented here)。语法有点令人困惑但它应该完成工作

Select
  MIN(ID) keep (dense_rank first order by id) as id,
  MIN(NAME) keep (dense_rank first order by id) as name,
  CODE
FROM YOUR_TABLE
GROUP BY CODE

我建议的另一种替代方法是使用@techdo建议的ROW_NUMBER函数,虽然我认为您需要从该答案中删除NAME列,而是使用:

SELECT * FROM(
  SELECT 
      ROW_NUMBER() over (partition by CODE order by ID) RNUM, 
      ID, 
      NAME, 
      CODE
    FROM YOUR_TABLE
  )x where RNUM=1;

答案 3 :(得分:0)

请尝试:

SELECT * FROM(
  SELECT 
      ROW_NUMBER() over (partition by NAME, CODE order by NAME, CODE) RNUM, 
      ID, 
      NAME, 
      CODE, 
      ADDRESS 
    FROM YourTABLE
  )x where RNUM=1;

答案 4 :(得分:0)

你也可以使用这个:

SELECT ID, Name, Code  
FROM table 
WHERE ID IN (SELECT Max(ID) 
             FROM table 
             GROUP BY Code
            )