Запрос Oracle для выбора отдельного значения на основе значения другого столбца

#sql #oracle

#sql #Oracle

Вопрос:

Рассмотрим приведенный ниже пример таблицы:

 ID    Value
123   ABC
456   DEF
456   ABC
  

Я хочу результат запроса select, как показано ниже:

 ID    Value
123   ABC
456   DEF
  

Примечание: Идентификатор имеет только 2 разных значения — «123» и «456». Выбор должен основываться на столбце «ID». Если присутствует значение «123», должны быть выбраны соответствующие данные из столбца «Значение». Если нет, должен быть получен идентификатор «456».

Комментарии:

1. опубликуйте фактическое значение ID, если это строка

2. Что вы подразумеваете под «Если присутствует значение «123» ?» в отношении чего? Вы сказали, что идентификатор имеет только 123 или 456, поэтому он должен присутствовать, не так ли?

Ответ №1:

простая группировка по поможет вам получить желаемый результат

 select min(id), value
from table
group by value
  

Комментарии:

1. Извините, забыл упомянуть, что ID не является числом. Это строка. Таким образом, min (id) не помогает.

2. @Viswa использует его как числовое значение use TO_NUMBER

3. функция min может применяться не только к числам.

4. функция min не будет работать, если 123 равно yyy, а 456 равно xxx

5. @psaraj12 . . . Затем используйте max() . Можно ответить только на заданный вопрос, и это кажется самым простым ответом.

Ответ №2:

Что-то вроде этого:

     select min(id) as id,
           Value 
    from table
    group by  Value, id
  

Ответ №3:

Вы можете использовать приведенный ниже идентификатор, если он представляет собой строку, например, 456 — это ‘xxx’, а 123 — это ‘yyy’, здесь используется SQL-код

 WITH tt1 
     AS (SELECT Decode(id, '123', 1, 
                           2) order1, 
                id, 
                value1 
         FROM   tt), 
     tt2 
     AS (SELECT Min(order1) order1, 
                value1 
         FROM   tt1 
         GROUP  BY value1) 
SELECT tt1.id, 
       tt1.value1 
FROM   tt2, 
       tt1 
WHERE  tt1.value1 = tt2.value1 
       AND tt1.order1 = tt2.order1;