Как сделать порядок по min() некоторого столбца?

Я довольно новичок в SQL. Мне нужен запрос, который должен упорядочивать по минимуму некоторого столбца. Ниже приведен запрос, который я хочу.

SELECT *
FROM   ( 
         SELECT p.PROJECT_ID,
                p.PROJECT_NAME,
                p.PROJECT_TYPE
         FROM   PROJECT p
                LEFT OUTER JOIN code c
                ON p.PROJECT_ID= c.PROJECT_ID
         WHERE  p.PROJECT_NAME IN ('test')
         ORDER BY min(c.LABEL) ASC
       )
WHERE  rownum <= 25;

Почему мне это нужно именно так. У меня есть одна таблица PROJECT.

PROJECT_ID  PROJECT_NAME    PROJECT_TYPE
1           a               test1
2           b               test2

у меня есть другой код таблицы, который имеет project_id в качестве внешнего ключа.

ID  PROJECT_ID  LABEL
1      1         a
2      1         b
3      1         c
4      2         d

теперь, когда я присоединюсь к нему на project_id и сделаю заказ на code.label, он даст мне 4 записи, три с идентификатором проекта 1 и 1 с идентификатором проекта 2. Но мое требование - отсортировать проект на основе метки кодов. поэтому логически я хочу две записи. Один для проекта с идентификатором 1 с минимальным значением метки всех возможных комбинаций идентификатора проекта 1, то есть с меткой a, а другой с идентификатором проекта 2. Вот почему я хочу отсортировать его на основе минимальной метки кода. Я не могу использовать group by, так как это снизит производительность.


person viv kumar    schedule 10.08.2017    source источник
comment
чтобы использовать MIN (это агрегатная функция), вы должны использовать предложение GROUP BY для группировки ваших записей.   -  person Esteban P.    schedule 10.08.2017
comment
откуда берется ваш столбец rownum?   -  person Esteban P.    schedule 10.08.2017
comment
Я думаю, вы просто хотите ORDER BY c.LABEL?   -  person Glenn    schedule 10.08.2017
comment
Вы должны показать некоторые образцы данных и желаемый результат. Как бы то ни было, как говорит Гленн, просто заказать через c.LABEL похоже, что это то, что вам нужно.   -  person Mat    schedule 10.08.2017
comment
Я не могу использовать только порядок, так как это дает мне повторяющиеся результаты из-за соединения.   -  person viv kumar    schedule 10.08.2017
comment
Попробуйте это: stackoverflow .com/questions/19761714/   -  person DreadedFrost    schedule 10.08.2017
comment
Без предложения GROUP BY у вас есть только одна группа строк (все строки в вашем объединении) и одно значение min(c.LABEL): сортировка по постоянному ключу не имеет смысла.   -  person Lorenzo Gatti    schedule 10.08.2017
comment
Вы не выбираете ни один столбец из c. По крайней мере, c.ID и c.LABEL важны, и их выбор сделает результаты более понятными.   -  person Lorenzo Gatti    schedule 10.08.2017
comment
Пример желаемого результата будет полезен.   -  person Sal    schedule 10.08.2017
comment
Это похоже на проблему XY. Объясните, пожалуйста, на словах, какие данные у вас есть и что вы хотите из них получить.   -  person William Robertson    schedule 11.08.2017
comment
Я обновил вопросы с необходимой информацией.   -  person viv kumar    schedule 11.08.2017


Ответы (1)


Для использования MIN() вам нужна группа, например:

SELECT  *
    FROM  ( 
      SELECT p.PROJECT_ID,
              p.PROJECT_NAME,
              p.PROJECT_TYPE
      FROM PROJECT p
      LEFT OUTER JOIN code c
      ON p.codeId=c.ID
      WHERE p.PROJECT_NAME IN ('test')
      GROUP BY .PROJECT_ID,
              p.PROJECT_NAME,
              p.PROJECT_TYPE
      ORDER BY min(c.LABEL) ASC
      )
     WHERE rownum <= 25;

и в некоторых БД вы должны выбрать столбец, который вам нужен для заказа, например:

SELECT  *
    FROM  ( 
      SELECT p.PROJECT_ID,
              p.PROJECT_NAME,
              p.PROJECT_TYPE,
               min(c.LABEL)
      FROM PROJECT p
      LEFT OUTER JOIN code c
      ON p.codeId=c.ID
      WHERE p.PROJECT_NAME IN ('test')
      GROUP BY .PROJECT_ID,
              p.PROJECT_NAME,
              p.PROJECT_TYPE
      ORDER BY min(c.LABEL) ASC
      )
     WHERE rownum <= 25;
person scaisEdge    schedule 10.08.2017