rowid 오라클로 삭제 (14)

Oracle에서 무언가를 테스트하고 일부 샘플 데이터로 테이블을 채우고 있지만 그 과정에서 실수로 중복 레코드를 로드하여 일부 열을 사용하여 기본 키를 생성할 수 없습니다.

모든 중복 행을 제거하고 그 중 하나만 남겨두는 방법은 무엇입니까?

솔루션 1)

rowid가 없는 emp에서 삭제(empno별로 emp 그룹에서 max(rowid) 선택);

솔루션 2)

emp에서 삭제(여기서 rowid 선택)

솔루션 3)

더 나은 성능을 위해 다음과 같이 썼습니다.
(실행 계획 참조)

DELETE FROM your_table WHERE rowid IN (your_table t1 LEFT OUTER JOIN에서 t1.rowid 선택 (SELECT MIN(rowid) as rowid, column1,column2, column3 FROM your_table GROUP BY column1, column2, column3) co1 ON (t1.rowid = co1. rowid) co1.rowid가 NULL인 곳);

아래 스크립트 확인 -

테이블 생성 test(id int,sal int);

테스트 값에 삽입(1,100); 테스트 값에 삽입(1,100); 테스트 값에 삽입(2,200); 테스트 값에 삽입(2,200); 테스트 값에 삽입(3,300); 테스트 값에 삽입(3,300); 저지르다;

테스트에서 *를 선택하십시오.

여기에 6개의 항목이 표시됩니다.
4. 아래 쿼리 실행 -

dup > 1인 테스트에서 삭제

  1. 테스트에서 *를 선택하십시오.

중복 항목이 제거된 것을 볼 수 있습니다.
이것이 귀하의 요청을 해결하기를 바랍니다. 덕분에 :)

중복을 선택하려면 쿼리 형식만 다음과 같을 수 있습니다.

SELECT GroupFunction(column1), GroupFunction(column2),..., COUNT(column1), column1, column2... FROM our_table GROUP BY column1, column2, column3... HAVING COUNT(column1) > 1

따라서 다른 제안에 대한 올바른 쿼리는 다음과 같습니다.

DELETE FROM tablename a WHERE a.ROWID > ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....so on.. 중복 행을 식별합니다.. ..)

이 쿼리는 오래된 기록 WHERE CLAUSE 에서 선택한 기준에 대한 데이터베이스에서.

Oracle 인증 어소시에이트(2008)

공통 테이블 표현식과 창 함수를 사용하는 답변을 본 적이 없습니다. 그것은 내가 작업하기 가장 쉬운 사람입니다.

DELETE FROM YourTable WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID, ROW_NUMBER() OVER(PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Name, Last_Name, Birth_Date) ORIDER UNDET BY ROW 선행 및 언바운드) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM 중복 WHERE RN > 1);

참고 사항:

1) 섹션에서 중복 필드만 확인합니다.

2) 다른 것보다 하나의 중복을 선택해야 하는 이유가 있는 경우 이 행이 row_number() = 1이 되도록 order by 절을 사용할 수 있습니다.

3) 마지막 where 절을 N >= 1인 "Where RN > N"으로 변경하여 저장된 중복 번호를 변경할 수 있습니다(N=0이 중복이 있는 모든 행을 제거하지만 모든 행만 제거한다고 생각했습니다).

4) 그룹의 행 번호로 각 흐름에 레이블을 지정하는 CTE 쿼리인 합계 섹션 필드를 추가했습니다. 따라서 첫 번째 요소를 포함하여 중복된 행을 선택하려면 "WHERE cnt > 1"을 사용하십시오.

1. 솔루션

rowid가 없는 emp에서 삭제(empno별로 emp 그룹에서 max(rowid) 선택);

2. 솔루션

emp에서 삭제(여기서 rowid 선택)

3.솔루션

rowid가 없는 emp e1에서 삭제(e1.empno = e2.empno인 emp e2에서 max(rowid) 선택);

4. 솔루션

emp에서 삭제(여기서 rowid 선택)

커서 c1이 조회에서 선택 *이므로 delete_duplicate_enq 프로시저를 작성하거나 대체하십시오. enquiry.enquiryno = z.enquiryno이고 rowid > any(enquiry.enquiryno = z.enquiryno인 문의에서 rowid 선택)에서 c1 루프 삭제 조회에서 z에 대해 시작합니다. 엔드 루프; 종료 delete_duplicate_enq;

테이블 생성 abcd(id number(10),name varchar2(20)) insert into abcd values(1,"abc") insert into abcd values(2,"pqr") insert into abcd values(3,"xyz") insert into abcd values(1,"abc") insert into abcd values(2,"pqr") insert into abcd values(3,"xyz") select * from abcd id 이름 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz 중복 레코드를 삭제하지만 테이블의 고유 레코드는 유지 DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); 위의 쿼리를 실행 3 행 삭제 select * from abcd id 이름 1 abc 2 pqr 3 xyz

항목 삭제

DELETE 문은 테이블에서 레코드를 제거하는 데 사용됩니다.

DELETE FROM 테이블 이름 WHERE 조건;

이 문은 지정된 조건을 충족하는 지정된 테이블 레코드(개별 열 값 아님)에서 제거합니다. 조건은 부울 표현식, 다양한 디자인이전 실습에서 다뤘던 내용입니다.

다음 쿼리는 LName 열의 값이 "Ivanov"인 Customer 테이블에서 레코드를 제거합니다.

고객에서 삭제

WHERE LName = "이바노프"

테이블에 성이 Ivanov인 여러 클라이언트에 대한 정보가 포함되어 있으면 모든 클라이언트가 삭제됩니다.

WHERE 절에는 데이터를 선택하기 위한 하위 쿼리(SELECT 문)가 포함될 수 있습니다. DELETE 문의 하위 쿼리는 SELECT 문에서와 정확히 동일한 방식으로 작동합니다. 다음 쿼리는 하위 쿼리를 사용하여 반환된 도시의 고유 식별자와 함께 모스크바 시에서 모든 고객을 제거합니다.

고객에서 삭제

WHERE IdCity IN (시에서 IdCity 선택 WHERE CityName = "모스크바")

Transact-SQL은 DELETE 문에서 다른 FROM 절을 사용할 수 있도록 하여 표준 SQL을 확장합니다. 조인을 지정하는 이 확장은 삭제할 행을 지정하기 위해 WHERE 절의 하위 쿼리 대신 사용할 수 있습니다. 두 번째 FROM에서 데이터를 설정하고 첫 번째 FROM 절의 테이블에서 해당 행을 제거할 수 있습니다. 특히 이전 쿼리는 다음과 같이 다시 작성할 수 있습니다.

고객에서 삭제

고객으로부터 k INNER JOIN

테이블에서 레코드를 삭제하는 작업은 SQL 문 공식화에서 의미론적(구문적 오류는 아님) 오류가 발생한 경우 되돌릴 수 없는 데이터 손실 위험과 관련이 있다는 점에서 위험합니다. 문제를 방지하려면 레코드를 삭제하기 전에 먼저 적절한 선택 쿼리를 실행하여 삭제할 레코드를 확인하는 것이 좋습니다. 따라서 예를 들어 앞에서 설명한 삭제 쿼리를 실행하기 전에 해당 선택 쿼리를 실행해도 문제가 되지 않습니다.

고르다*

고객으로부터 k INNER JOIN

도시 c ON k.IdCity = c.IdCity AND c.CityName = "모스크바"

테이블에서 모든 레코드를 제거하려면 DELETE 문을 사용하지 않고 예어어디. 동시에 모든 열이 정의된 테이블 자체가 저장되고 새 레코드를 삽입할 준비가 됩니다. 예를 들어 다음 쿼리는 모든 제품에 대한 레코드를 제거합니다.

제품에서 삭제

독립적인 작업을 위한 작업:에 공식화 SQL 언어상품이 포함되지 않은 모든 주문(즉, 모든 빈 주문) 삭제 요청.



Oracle의 테이블에서 중복 행 제거 (14)

솔루션 1)

rowid가 없는 emp에서 삭제(empno별로 emp 그룹에서 max(rowid) 선택);

솔루션 2)

emp에서 삭제(여기서 rowid 선택)

솔루션 3)

Oracle에서 무언가를 테스트하고 일부 샘플 데이터로 테이블을 채우고 있지만 그 과정에서 실수로 중복 레코드를 로드하여 일부 열을 사용하여 기본 키를 생성할 수 없습니다.

모든 중복 행을 제거하고 그 중 하나만 남겨두는 방법은 무엇입니까?

더 나은 성능을 위해 다음과 같이 썼습니다.
(실행 계획 참조)

DELETE FROM your_table WHERE rowid IN (your_table t1 LEFT OUTER JOIN에서 t1.rowid 선택 (SELECT MIN(rowid) as rowid, column1,column2, column3 FROM your_table GROUP BY column1, column2, column3) co1 ON (t1.rowid = co1. rowid) co1.rowid가 NULL인 곳);

아래 스크립트 확인 -

테이블 생성 test(id int,sal int);

테스트 값에 삽입(1,100); 테스트 값에 삽입(1,100); 테스트 값에 삽입(2,200); 테스트 값에 삽입(2,200); 테스트 값에 삽입(3,300); 테스트 값에 삽입(3,300); 저지르다;

테스트에서 *를 선택하십시오.

여기에 6개의 항목이 표시됩니다.
4. 아래 쿼리 실행 -

dup > 1인 테스트에서 삭제

  1. 테스트에서 *를 선택하십시오.

중복 항목이 제거된 것을 볼 수 있습니다.
이것이 귀하의 요청을 해결하기를 바랍니다. 덕분에 :)

중복을 선택하려면 쿼리 형식만 다음과 같을 수 있습니다.

SELECT GroupFunction(column1), GroupFunction(column2),..., COUNT(column1), column1, column2... FROM our_table GROUP BY column1, column2, column3... HAVING COUNT(column1) > 1

따라서 다른 제안에 대한 올바른 쿼리는 다음과 같습니다.

DELETE FROM tablename a WHERE a.ROWID > ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....so on.. 중복 행을 식별합니다.. ..)

이 쿼리는 WHERE CLAUSE에서 선택한 기준에 대해 데이터베이스에서 가장 오래된 항목을 저장합니다.

Oracle 인증 어소시에이트(2008)

공통 테이블 표현식과 창 함수를 사용하는 답변을 본 적이 없습니다. 그것은 내가 작업하기 가장 쉬운 사람입니다.

DELETE FROM YourTable WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID, ROW_NUMBER() OVER(PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Name, Last_Name, Birth_Date) ORIDER UNDET BY ROW 선행 및 언바운드) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM 중복 WHERE RN > 1);

참고 사항:

1) 섹션에서 중복 필드만 확인합니다.

2) 다른 것보다 하나의 중복을 선택해야 하는 이유가 있는 경우 이 행이 row_number() = 1이 되도록 order by 절을 사용할 수 있습니다.

3) 마지막 where 절을 N >= 1인 "Where RN > N"으로 변경하여 저장된 중복 번호를 변경할 수 있습니다(N=0이 중복이 있는 모든 행을 제거하지만 모든 행만 제거한다고 생각했습니다).

4) 그룹의 행 번호로 각 흐름에 레이블을 지정하는 CTE 쿼리인 합계 섹션 필드를 추가했습니다. 따라서 첫 번째 요소를 포함하여 중복된 행을 선택하려면 "WHERE cnt > 1"을 사용하십시오.

1. 솔루션

rowid가 없는 emp에서 삭제(empno별로 emp 그룹에서 max(rowid) 선택);

2. 솔루션

emp에서 삭제(여기서 rowid 선택)

3.솔루션

rowid가 없는 emp e1에서 삭제(e1.empno = e2.empno인 emp e2에서 max(rowid) 선택);

4. 솔루션

emp에서 삭제(여기서 rowid 선택)

커서 c1이 조회에서 선택 *이므로 delete_duplicate_enq 프로시저를 작성하거나 대체하십시오. enquiry.enquiryno = z.enquiryno이고 rowid > any(enquiry.enquiryno = z.enquiryno인 문의에서 rowid 선택)에서 c1 루프 삭제 조회에서 z에 대해 시작합니다. 엔드 루프; 종료 delete_duplicate_enq;

테이블 생성 abcd(id number(10),name varchar2(20)) insert into abcd values(1,"abc") insert into abcd values(2,"pqr") insert into abcd values(3,"xyz") insert into abcd values(1,"abc") insert into abcd values(2,"pqr") insert into abcd values(3,"xyz") select * from abcd id 이름 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz 중복 레코드를 삭제하지만 테이블의 고유 레코드는 유지 DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); 위의 쿼리를 실행 3 행 삭제 select * from abcd id 이름 1 abc 2 pqr 3 xyz

Oracle 플랫폼을 사용하면 다음과 같이 테이블, 뷰, 구체화된 뷰, 중첩된 하위 쿼리, 분할된 뷰 및 테이블에서 행을 삭제할 수 있습니다.

(table_name | ONLY (table_name)) [별칭] [(PARTITION (partition_name) SUBPARTITION

(subsection_name))] | (하위 쿼리)]) | TABLE(collection_expression) [(+)])

INTO 변수 [, …]]

파라미터는 아래와 같습니다.

table_name [별칭]

레코드를 삭제할 테이블, 뷰, 구체화된 뷰 또는 분할된 테이블이나 뷰를 지정합니다. 선택적으로 table_name 앞에 스키마를 추가하거나 테이블 이름 뒤에 데이터베이스 연결을 지정할 수 있습니다. 그렇지 않으면 Oracle은 현재 스키마를 사용하고 로컬 서버데이터 베이스. 선택적으로 table_name에 별칭을 지정할 수 있습니다. 테이블이 개체 유형의 속성 또는 메서드를 참조하는 경우 별칭이 필요합니다.

PARTITION 파티션 이름

삭제 작업은 전체 테이블이 아니라 지정된 파티션에 적용됩니다. 파티션된 테이블에서 삭제할 때 파티션 이름을 지정할 필요는 없지만 많은 경우 WHERE 절의 복잡성을 줄이는 데 도움이 됩니다.

SUBPARTITION(subpartition_name)

삭제는 전체 테이블이 아니라 지정된 하위 키에 적용됩니다.

(하위 쿼리 )])

삭제 작업의 대상이 테이블, 뷰 또는 기타 데이터베이스 개체가 아닌 중첩된 하위 쿼리임을 지정합니다. 이 제안의 매개변수는 다음과 같습니다.

하위 쿼리

하위 쿼리인 SELECT 문이 지정되었습니다. 표준 하위 쿼리를 만들 수 있지만 ORDER BY 절을 포함할 수 없습니다.

읽기 전용

하위 쿼리를 업데이트할 수 없음을 나타냅니다.

체크 옵션 포함

Oracle은 하위 쿼리의 결과 집합에 표시되지 않는 원격 테이블의 변경 사항을 거부합니다.

CONSTRAINT 제약 이름

Oracle 시스템은 constraint_name이라는 제약 조건에 따라 변경 사항을 제한합니다.

TABLE(롤렉션에 대한 표현식) [(+)]

Oracle 시스템은 실제로 하위 쿼리, 함수 또는 기타 컬렉션 생성자가 될 수 있지만 롤 표현식을 테이블로 처리합니다. 두 경우 모두 For Rollection 표현식에서 반환된 값은 중첩 테이블 또는 VARRAY여야 합니다.

RETURNING 표현식

DELETE 명령이 일반적으로 카운트만 반환하는 명령의 영향을 받는 행을 검색합니다. 삭제된 행. RETURNING 절은 명령의 대상이 테이블, 구체화된 뷰 또는 단일 기본 테이블의 뷰인 경우 사용할 수 있습니다. 단일 행을 삭제할 때 절을 사용하면 표현식에 의해 결정된 삭제된 행의 값이 PL/SQL 변수와 바인드 변수에 저장됩니다. 여러 행을 삭제할 때 절을 사용하면 표현식에 의해 결정된 삭제된 행의 값이 바인드 배열에 저장됩니다.

INTO 변수

RETURNING 절의 결과로 반환된 값이 기록되는 변수가 지정됩니다.

DELETE 문을 실행할 때 Oracle은 테이블(또는 기본 뷰 테이블)에서 확보된 공간을 데이터가 저장된 테이블이나 인덱스로 다시 반환합니다.

뷰에서 데이터가 제거되면 뷰는 집합 연산, DISTINCT 키워드, 조인, 집계 함수, 분석 함수, SELECT 하위 쿼리, GROUP BY 절, ORDER BY 절, CONNECT BY 절 또는 START를 포함할 수 없습니다. 와 절.

다음은 원격 서버에서 데이터를 삭제하는 예입니다.

스콧에서 삭제 [이메일 보호됨];

다음 예에서

컬렉션에 대한 표현식에 지정된 파생 테이블에서 데이터를 삭제하고 있습니다.

DELETE TABLE(고객의 연락처 이름 선택

WHERE c.customerid="BOTTM") s WHERE s. 지역 IS NULL 또는 s.country="MEXICO";

그리고 다음은 해당 섹션에서 삭제하는 예입니다.

DELETE FROM sales PARTITION (sales_q3_1997) WHERE 수량 > 10000;

마지막으로 다음 예에서는 RETURNING 절을 사용하여 삭제된 값을 확인합니다.

직원 WHERE job_id=13에서 삭제

그리고 hire_date + TO_YMINTERVAL("01-06") =.

이전 예는 직원 테이블에서 레코드를 제거하고 사전 정의된 변수인 intl에 작업 값을 반환합니다.