Oracle10g 如何删除相似行中具有非常特定条件的相似行?

Oracle10g 如何删除相似行中具有非常特定条件的相似行?,oracle10g,Oracle10g,在Oracle10g中,我有一个没有完全重复的表,但有许多类似的行。这是可以的,但我想删除类似行集合中具有一个特定条件的行。标准是多个帐户与一个机构名称关联。当有多个帐户用于该机构名称时,我想删除帐户值为空的所有记录。但是,如果一个机构名称只有一个实例,并且ACCT为NULL,则我希望保留该记录 SAMPLE DATA: ACCT PRACTICE_NAME STATE PHONE ======================================= NULL

在Oracle10g中,我有一个没有完全重复的表,但有许多类似的行。这是可以的,但我想删除类似行集合中具有一个特定条件的行。标准是多个帐户与一个机构名称关联。当有多个帐户用于该机构名称时,我想删除帐户值为空的所有记录。但是,如果一个机构名称只有一个实例,并且ACCT为NULL,则我希望保留该记录

SAMPLE DATA:
ACCT    PRACTICE_NAME   STATE   PHONE
=======================================
NULL      PRACT1         MI    111-1111
1523      PRACT1         MI    111-1111
6824      PRACT1         MI    111-1111
NULL      PRACT2         MI    222-2222
8945      PRACT2         MI    222-2222
NULL      PRACT3         MI    333-3333
1486      PRACT4         MI    444-4444
这就是我想要的结果:

ACCT    PRACTICE_NAME   STATE   PHONE
=======================================
1523      PRACT1         MI    111-1111
6824      PRACT1         MI    111-1111
8945      PRACT2         MI    222-2222
NULL      PRACT3         MI    333-3333
1486      PRACT4         MI    444-4444

您需要使用practice_名称上的组来计算每个组实际存在的记录数。使用这些信息,您可以找到记录>1的机构名称列表

下面的SQL将处理您提到的情况

DELETE FROM ZZ_TEST ZZ
  WHERE ZZ.PRACTICE_NAME IN (
      SELECT PRACTICE_NAME FROM (  
           SELECT PRACTICE_NAME, COUNT (PRACTICE_NAME) AS COUNTER FROM ZZ_TEST
               GROUP BY PRACTICE_NAME) TMP_COUNTER
      WHERE COUNTER > 1)
      AND ACCT IS NULL;

唐尼,非常感谢你。