Oracle — уникальные комбинации значений из нескольких столбцов, но возвращающие другие столбцы

Я пытаюсь понять, как извлекать различные сценарии данных из моей таблицы для тестирования. Предположим, что в моей таблице есть эти три поля FIELD1, FIELD2, FIELD3. Если я хочу найти различные сценарии в своих данных, я мог бы просто сделать это

select distinct FIELD1, FIELD2, FIELD3 from <table>

И это работает. Проблема в том, что у меня есть множество других полей, из которых мне нужны данные, но не имеет значения, что это за данные, если они связаны с результирующей записью. Так, например, если приведенный выше запрос вернул это как один из результатов

FIELD1  FIELD2  FIELD3
----------------------
Y       Blue    31

Я хотел бы увидеть другие поля контента (скажем, от 4 до 10). Теперь, независимо от того, пришли ли они из записи № 30 или записи № 20000 (при условии, что эти записи содержат эти 3 возвращаемых значения), это не имеет значения, если все поля были возвращены указанной записью.

Надеюсь, что это имеет смысл, и кто-то может помочь!


person dscl    schedule 12.04.2011    source источник
comment
Должны ли значения в полях FIELD4–FIELD10 браться из одной и той же записи? Или FIELD4 может исходить из записи № 30, а FIELD5 — из записи № 20000 и т. д.?   -  person Shannon Severance    schedule 13.04.2011
comment
@Shannon - наверное, нет, но было бы предпочтительнее.   -  person dscl    schedule 13.04.2011


Ответы (2)


Что-то типа

SELECT field1, 
       field2,
       field3,
       field4,
       ....
       field10
  FROM( SELECT field1,
               field2,
               ...,
               field10,
               rowid rid,
               min(rowid) OVER (partition by field1, field2, field3) min_rid
          FROM your_table_name )
 WHERE rid = min_rid

должно сработать. Если есть первичный ключ, вы можете использовать его, а не ROWID, я просто использую его, чтобы иметь что-то, что гарантированно будет уникальным.

Для вашего кривого мяча

SELECT field1, 
       field2,
       field3,
       field4,
       ....
       field10
  FROM( SELECT field1,
               field2,
               (CASE WHEN field3 IS NULL
                     THEN 'NULL'
                     ELSE field3
                 END) field3,
               ...,
               field10,
               rowid rid,
               min(rowid) OVER (partition by field1, 
                                             field2, 
                                             (CASE WHEN field3 IS NULL
                                                   THEN 'NULL'
                                                   ELSE field3
                                               END) min_rid
          FROM your_table_name )
 WHERE rid = min_rid
person Justin Cave    schedule 12.04.2011
comment
Потрясающе - нужно время, чтобы похрустеть, но я воспринимаю это как хороший знак. 1 кривая мяч, хотя. Скажем, field3 может быть нулевым или иметь какое-то значение. Когда значение не равно нулю, я хочу относиться к ним одинаково. Что-то в этом случае, когда field3 имеет значение null, а затем null, иначе «X» заканчивается как field3. Просто не уверен, как бы я реализовал это как во внешнем выборе, так и в разделе. - person dscl; 13.04.2011
comment
@dscl - Покрыл кривую - person Justin Cave; 13.04.2011
comment
Спасибо, Джастин, я попробовал это самостоятельно, и почти все было покрыто, просто возникла проблема с '( )'. - person dscl; 13.04.2011

Попробуй это:

select a.* 
from tblA a, 
     (select min(rowid), col_1, col_2 from tblA
      group by col_1, col_2) b
where a.rowid=b.rid;      
person laurit    schedule 21.08.2014