2014-01-03 4 views
-1

Я хочу удалить повторяющиеся строки из нижеследующего запроса.Удалить дубликаты из вывода Oracle SQL Query

 SELECT CONTACTS.ROWID as ROW_PASS, 
      DUTY_ROTA.ROWID as ROW_PASS_ROTA, 
      DUTY_ROTA.DUTY_DATE AS DUTY_DATE, 
      DUTY_ROTA.DUTY_TYPE AS DUTY_TYPE, 
      DUTY_ROTA.DUTY_OFFICER AS DUTY_OFFICER, 
      DUTY_TYPES.DESCRIPTION AS DUTY_DESC, 
      CONTACTS.SNAME AS FULLNAME, 
      CONTACTS.MOBILE AS MOBILE_NO, 
      CONTACTS.TELNO AS OFFICE_TEL 
     FROM DUTY_ROTA, 
       DUTY_TYPES, 
       CONTACTS 
     WHERE DUTY_DATE between SYSDATE-1 
       AND SYSDATE+18 
       AND DUTY_ROTA.DUTY_TYPE = DUTY_TYPES.DUTY_TYPE 
       AND duty_rota.DUTY_OFFICER = contacts.duty_id 
       AND SNAME IS NOT NULL 

Я пытался определить дубликаты ниже способом - (принимая COUNT (*) и группу по столбцам)

Я пытался что-то вроде ниже фрагмент кода тоже, но не помогает Я получаю правильный parenthisis отсутствующий ошибка

SELECT CONTACTS.SNAME AS FULLNAME, 
CONTACTS.ROWID as ROW_ID_CONTACT, 
DUTY_ROTA.ROWID as ROW_ID_ROTA, 
DUTY_ROTA.DUTY_TYPE AS DUTY_TYPE, 
DUTY_ROTA.DUTY_OFFICER AS DUTY_OFFICER, 
DUTY_TYPES.DESCRIPTION AS DUTY_DESC, 
CONTACTS.MOBILE AS MOBILE_NO, 
CONTACTS.OFFICETEL AS OFFICE_TEL, 
     Row_number() 
     OVER ( 
      partition BY CONTACTS.SNAME AS FULLNAME, 
CONTACTS.ROWID as ROW_ID_CONTACT, 
DUTY_ROTA.ROWID as ROW_ID_ROTA, 
DUTY_ROTA.DUTY_TYPE AS DUTY_TYPE, 
DUTY_ROTA.DUTY_OFFICER AS DUTY_OFFICER, 
DUTY_TYPES.DESCRIPTION AS DUTY_DESC, 
CONTACTS.MOBILE AS MOBILE_NO, 
CONTACTS.OFFICETEL AS OFFICE_TEL 
      ) AS rn 
FROM DUTY_ROTA,DUTY_TYPES,CONTACTS WHERE DUTY_DATE between SYSDATE and SYSDATE+300 and contacts.duty_id = duty_rota.duty_officer 
AND DUTY_ROTA.DUTY_TYPE = DUTY_TYPES.DUTY_TYPE AND SNAME IS NOT NULL 
+0

SELECT DISTINCT? – Mihai

+0

И ваша проблема? –

+0

Проблема заключается в том, что она не работает, она не получает никаких значений (*)> 2, хотя, просматривая, я могу видеть повторяющиеся столбцы. – Subhamoy

ответ

0

насколько я помню, в Oracle ROWID будет уникальным для каждой строки в таблице, так что ваш запрос будет возвращать одну строку для каждой строки в выражении WHERE.

1

использование имеющий положение, как показано ниже, пожалуйста, удалите ROWID, а

SELECT count(*),DUTY_ROTA.DUTY_DATE AS DUTY_DATE,DUTY_ROTA.DUTY_TYPE AS DUTY_TYPE,DUTY_ROTA.DUTY_OFFICER AS DUTY_OFFICER,DUTY_TYPES.DESCRIPTION AS DUTY_DESC,CONTACTS.SNAME AS FULLNAME,CONTACTS.MOBILE AS MOBILE_NO,CONTACTS.TELNO AS OFFICE_TEL FROM DUTY_ROTA,DUTY_TYPES,CONTACTS WHERE DUTY_DATE between SYSDATE-1 and SYSDATE+18 AND DUTY_ROTA.DUTY_TYPE = DUTY_TYPES.DUTY_TYPE AND duty_rota.DUTY_OFFICER = contacts.duty_id and SNAME IS NOT NULL 
group by 
DUTY_ROTA.DUTY_DATE, 
DUTY_ROTA.DUTY_TYPE, 
DUTY_ROTA.DUTY_OFFICER, 
DUTY_TYPES.DESCRIPTION, 
CONTACTS.SNAME, 
CONTACTS.MOBILE, 
CONTACTS.TELNO 
having count(*) > 1; 
0

Попробуйте использовать RowNumber

SELECT * FROM 
    (
    SELECT 
    CONTACTS.SNAME AS FULLNAME, 
    CONTACTS.ROWID as ROW_ID_CONTACT, 
    DUTY_ROTA.ROWID as ROW_ID_ROTA, 
    DUTY_ROTA.DUTY_TYPE AS DUTY_TYPE, 
    DUTY_ROTA.DUTY_OFFICER AS DUTY_OFFICER, 
    DUTY_TYPES.DESCRIPTION AS DUTY_DESC, 
    CONTACTS.MOBILE AS MOBILE_NO, 
    CONTACTS.OFFICETEL AS OFFICE_TEL, 
    Row_number() OVER (Partition BY CONTACTS.SNAME AS FULLNAME, 
        CONTACTS.ROWID as ROW_ID_CONTACT, 
        DUTY_ROTA.ROWID as ROW_ID_ROTA, 
        DUTY_ROTA.DUTY_TYPE AS DUTY_TYPE, 
        DUTY_ROTA.DUTY_OFFICER AS DUTY_OFFICER, 
        DUTY_TYPES.DESCRIPTION AS DUTY_DESC, 
        CONTACTS.MOBILE AS MOBILE_NO, 
        CONTACTS.OFFICETEL AS OFFICE_TEL 
        Order By DUTY_ROTA.ROWID 
        ) AS RN 
    FROM DUTY_ROTA,DUTY_TYPES,CONTACTS WHERE DUTY_DATE between SYSDATE and SYSDATE+300  
    AND contacts.duty_id = duty_rota.duty_officer  
    AND DUTY_ROTA.DUTY_TYPE = DUTY_TYPES.DUTY_TYPE AND SNAME IS NOT NULL 
) 
Where RN=1 

Refer

+0

Hi Vignesh, Можете ли вы мне помочь? Как я могу согласиться с моим запросом. Использование RowNumber и раздела для меня нова. – Subhamoy

+0

Привет @Subhamoy У меня есть обновленное решение. Пожалуйста, проверьте это и дайте мне знать статус –

0
DELETE FROM table_name 
WHERE rowid NOT IN 
        ( 
        SELECT MIN(rowid) 
        FROM table_name 
        GROUP BY column1, column2, column3... 
        ) ; 

OR

CREATE TABLE t2 AS SELECT DISTINCT * FROM t1;