2016-05-12 5 views
0

У меня есть длинный комплексный (для меня хотя бы) запрос, который возвращает точные данные, которые мне нужны. Только проблема состоит в том, что некоторые идентификаторы дублируются из-за одного соединения в запросе, имеющем отношение «много к одному». То, что я хотел бы сделать, это просто взять результат из запроса и выбрать одну строку для каждого уникального идентификатора. На самом деле неважно, как эта строка выбрана из повторяющихся идентификаторов, мне просто нужно, чтобы она была уменьшена до одной строки на идентификатор самым простым способом.Oracle SQL - удаление дубликатов из беспорядочного запроса

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

ID column1 column2 column2... column50 
111 data data data ... data 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 
113 data data data ... data 
113 data data data ... data 

И я хочу взять этот вывод из запроса и уменьшить его

ID column1 column2 column2... column50 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 

проблема у меня в том, что я не знаю, как взять на себя весь вывод из запроса и делать вещи с ним (например, удалить дубликаты) без первой записи на стол, и я m не умеет писать в таблицу.

+0

Вы должны указать, как выбрать строку каждого идентификатора. (rowno возможно?) – jarlh

+2

Кроме того, редактирование вашего вопроса, чтобы предоставить (короткий!) пример вашего запроса, чтобы идти вместе с вашими примерными данными, поможет. Кроме того, это помогло бы, если бы вы могли предоставить некоторые примеры данных, которые точно реплицировали вашу проблему в небольших масштабах - например, ваши «дублированные» строки, имеют ли они одни и те же данные для каждого столбца? Или данные могут быть разными, например. (id = 111, col1 = 'a', col2 = 10) id = 111, col1 = 'a', col2 = 20)? Если последний, какую строку вы хотите выбрать? – Boneist

ответ

2

Если данные идентичны, самым простым способом является обернуть ваш беспорядочный запрос в другой запрос, в котором вы просто используете SELECT DISTINCT. как это:

SELECT DISTINCT * 
FROM (
    your_messy_query 
) 

Если не совпадает, то вы можете использовать:

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY something) AS rn 
    FROM (
    your_messy_query 
) t 
) 
WHERE rn = 1; 

ORDER BY something может быть:

  • конкретный набор столбцов, если вы, как получить наиболее соответствующие данные;
  • или вы можете использовать ORDER BY ROWNUM, если хотите просто взять первую строку каждой группы;
  • или ORDER BY NULL, если вы хотите не детерминированный порядок, однако, как правило, это, как представляется, реализуется с тем же эффектом, что и ORDER BY ROWNUM.
+0

Спасибо, я смотрю на второй случай (это не идентично), но я получаю «ORA-00923: ключевое слово FROM не найдено, где ожидалось». Я изменил свой грязный запрос, чтобы быть просто «SELECT * FROM КЛИЕНТ», чтобы сохранить его простым и я получаю ту же ошибку - вот полный запрос ... SELECT * FROM ( SELECT, т * ROW_NUMBER.() OVER (PARTITION BY CUSTOMER_ID ORDER BY ROWNUM), как р-н из ( SELECT * FROM CUSTOMER ) т ) ГДЕ гп = 1; –

+0

неважно, я обнаружил недостающую запятую после «SELECT t. *» –

+0

NP благодарит за вашу помощь, рад, что я мог бы использовать хотя бы lol –

Смежные вопросы