2014-09-19 77 views
1

我得到了这样的查询如何获得价值最高的排?

SELECT 
    IMAGE_PATH, IMAGE_ID, DOC_NID 
FROM 
    TBL_IMAGE WHERE IMAGE_ORD = 1 

并有后续条件

  • image_ord应该BR改为image_ord =最大值
  • image_ord列号码类型,它有一些重复
  • 我只需要一个最大值的image_ord
  • 它可以处理与rownum处理,但我不想因为它有很多层(这是子查询)

是否可以在没有子查询的情况下处理?

+0

这是不是很清楚,我:如果_“image_ord [...]有一些重复” _和_你“只需要一排与image_ord的最大价值” _你怎么不同的区分具有相同最大'image_ord'的行? – 2014-09-19 08:43:20

+0

@SylvainLeroux它有几行的值为1.我知道这是错误的DB计划,但它不是一个序列,只是数字类型列。无论如何,当我按'排序'时,第一行总是相同的。 – 2014-09-19 09:08:19

+0

'ORDER BY'是什么?如果这是'ORDER BY IMAGE_ORG',那么不应该依赖这样的事实:对于_same_“IMAGE_ORG”值,以任何特定顺序检索行。 – 2014-09-19 09:28:53

回答

0

根据您的要求:

“image_ord [...]有一些重复”

“我只需要一排用的最大价值image_ord“

WITH C AS (SELECT MAX(IMAGE_ORD) M FROM TBL_IMAGE) 
SELECT 
    TBL_IMAGE.IMAGE_PATH, TBL_IMAGE.IMAGE_ID, TBL_IMAGE.DOC_NID 
FROM 
    TBL_IMAGE JOIN C ON IMAGE_ORD = C.M 
WHERE ROWNUM < 2 
  • WITH ...语句将获取最大价值,为image_ord
  • SELECT ...语句将临时表上使用JOIN上述
  • WHERE ROWNUM < 2将结果的数量限制为1排

请注意,如果没有(明确的)ORDER BY子句,SELECT语句的结果应视为无序的一组行。所以在重复的情况下,你不应该依赖任何特定的行(甚至是同一行)被返回。只需“一”行具有最大值image_ord价值。

+0

感谢您的回答。我也担心image_ord值的重复,但我不知道如何避免这种情况。无论如何,我喜欢你的精彩答案,特别是使用'with'。这使得更清晰,更好:D非常感谢b – 2014-09-19 14:17:44

0

试试这个:

SELECT 
    IMAGE_PATH, IMAGE_ID, DOC_NID, Max(image_ord) 
FROM 
    TBL_IMAGE WHERE IMAGE_ORD = 1 group by IMAGE_PATH, IMAGE_ID, DOC_NID 
+0

那么,如果你搜索'max(image_ord)',那么'where image_ord = 1'语句不合适。 – yamny 2014-09-19 09:18:13

+0

那么只要在这种情况下删除条件可能会有所帮助? – 2014-09-19 09:21:24

0

我解决了我自己的问题跟随查询。 无论如何,我不得不使用子查询,并添加一些额外的功能,在大括号中使用。

select 
    doc_nid, max(image_ord) as image_ord 
from 
    (
    select 
     doc_nid, nvl(image_ord, 0) as image_ord 
    from 
     tbl_image 
    where 
     doc_nid is not null 
) 
group by doc_nid