2

Oracle DB に次のようなテーブルがあるとします。

COL_A     COL_B     COL_C     COL_D   .... COL_XXX
A         1         2         1    ....
A         1         2         2    ....
A         1         2         3    ....
A         2         3         4    ....
B         1         2         5    ....
B         1         2         6    ....
B         1         2         7    ....
B         4         2         8    ....
B         1         4         9    ....
C         1         2         10    ....
C         1         2         11    ....
C         1         2         12    ....
C         1         2         13    ....
C         1         2         14    ....

そして、テーブル内の他のすべての列に関係なくCOL_A、同じでCOL_Bあり、異なるレコードのみを見つけて(したがって、SQL で句を使用することはできません)、すべての値がのすべての値が同じです(この例では、 = "C"の場合、 &のすべての値が同じです)。COL_CDistinctCOL_ACOL_BCOL_CCOL_A

(つまり、テーブルの他の行に関係なく、一致するCOL_B/値に少なくとも 1 つの違いがある値のみを返します。)COL_CCOL_A

したがって、結果セットを次のようにしたいと思います。

COL_A     COL_B     COL_C
A         1         2    
A         2         3    
B         1         2    
B         4         2    
B         1         4    

したがって、私が作成した SQL は次のようになります。

Select b.* FROM
(
   Select a.*, COUNT(a.COL_A) OVER(PARTITION BY a.COL_A) as CNT FROM
   (
       select DISTINCT COL_A, COL_B, COL_C from MyTable) a
   ) b
WHERE
b.CNT > 1

さて、これは機能しますが、このデータを取得するためのより良い/より効率的な方法があるかどうか知りたいですか??

ありがとう!!!

4

2 に答える 2

3

テーブルをそれ自体に結合して、COL_A に一致するが COL_B または COL_C が異なる他の行を検索します。

select distinct t1.COL_A, t1.COL_B, t1.COL_C
from MyTable t1
join MyTable t2 on t1.COL_A = t2.COL_A
    AND (t1.COL_B != t2.COL_B OR t1.COL_C != t2.COL_C)

これがSQLFiddleで動作していることを確認してください

行を並べたい場合はorder by、末尾に an を追加します。

これにインデックスを付ける(COL_A)と、非常にうまく機能します。これに複合インデックスを(COL_A, COL_B, COL_C)使用すると、非常にうまく機能します。

于 2013-08-26T14:37:15.407 に答える
1

サブクエリを使用して、同じであるが異なるorexistsを持つ少なくとも 1 つの行が存在することを要求できます。col_acol_bcol_c

select  distinct col_a, col_b, col_c
from    YourTable yt1
where   exists
        (
        select  *
        from    YourTable yt2
        where   yt1.col_a = yt2.col_a
                and (yt1.col_b <> yt2.col_b
                     or yt1.col_c <> yt2.col_c)
        )

SQL Fiddle で動作することを確認してください。

于 2013-08-26T14:38:57.663 に答える