0

以下のようなデータセットがあります。

SELECT '  1234 ' ID,NULL TAG,' AB' CODE FROM DUAL
UNION ALL 
SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
UNION ALL
SELECT '1234' ID,NULL TAG,' AB' CODE FROM DUAL)

以下のクエリで重複を取得しようとしています。出力は行 1 と 3 である必要がありますが、1 または 3 のトリミングされた出力として 1 行しか得られません。

SELECT TRIM(ID),TRIM(TAG),TRIM(CODE) FROM 
(SELECT '  1234 ' ID,NULL TAG,' AB' CODE FROM DUAL
UNION ALL 
SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
UNION ALL
SELECT '1234' ID,NULL TAG,' AB' CODE FROM DUAL)
WHERE (TRIM(ID),TRIM(TAG),TRIM(CODE)) IN 
(
SELECT TRIM(ID),TRIM(TAG),TRIM(CODE) FROM
(SELECT '  1234 ' ID,NULL TAG,' AB' CODE FROM DUAL
UNION ALL 
SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
UNION ALL
SELECT '1234' ID,NULL TAG,' AB' CODE FROM DUAL)
GROUP BY TRIM(ID),TRIM(TAG),TRIM(CODE)
HAVING COUNT(*) >1
)
4

1 に答える 1

1

これを実行したところ、行 1 と 3 が返されました。

SELECT TRIM(ID),TRIM(TAG),TRIM(CODE) 
FROM 
(
    SELECT '  1234 ' ID,NULL TAG,' AB' CODE FROM DUAL
    UNION ALL 
    SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
    UNION ALL
    SELECT '1234' ID,NULL TAG,' AB' CODE FROM DUAL
)
WHERE TRIM(ID) IN 
(
    SELECT TRIM(ID)
    FROM
    (
        SELECT '  1234 ' ID,NULL TAG,' AB' CODE FROM DUAL
        UNION ALL 
        SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
        UNION ALL
        SELECT '1234' ID,NULL TAG,' AB' CODE FROM DUAL
    )
   GROUP BY TRIM(ID),TRIM(TAG),TRIM(CODE)
   HAVING COUNT(*) >1
)

3 つの値すべてWHEREではなく のみを参照するように変更しました。TRIM(ID)

編集 #1、問題の一部は、あなたができないものと比較nullしていることです。nullしたがってnull、列をチェックして、そうである場合はnullそれを置き換えることができます。null列をラップしたnvl(null, 'na')ので、比較する値がありました:

SELECT TRIM(ID) id,TRIM(TAG) tag,TRIM(CODE) code 
FROM 
(
    SELECT '  1234 ' ID, nvl(null, 'na') TAG,' AB' CODE FROM DUAL
    UNION ALL 
    SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
    UNION ALL
    SELECT '  1234 ' ID,nvl(null, 'na') TAG,' AB' CODE FROM DUAL
    UNION ALL 
    SELECT '  1234 ' ID,nvl(null, 'na') TAG,' AC' CODE FROM DUAL
)
WHERE (TRIM(ID),TRIM(TAG),TRIM(CODE)) IN 
(
    SELECT TRIM(ID),TRIM(TAG),TRIM(CODE) 
    FROM
    (
        SELECT '  1234 ' ID,nvl(null, 'na') TAG,' AB' CODE FROM DUAL
        UNION ALL 
        SELECT '453' ID,'GEN' TAG,'AB' CODE FROM DUAL
        UNION ALL
        SELECT '  1234 ' ID,nvl(null, 'na') TAG,' AB' CODE FROM DUAL
        UNION ALL 
        SELECT '  1234 ' ID,nvl(null, 'na') TAG,' AC' CODE FROM DUAL
    )
   GROUP BY TRIM(ID), TRIM(CODE), TRIM(TAG)
   HAVING COUNT(*) >1
)

デモで SQL Fiddle を参照してください

于 2012-08-22T19:16:05.053 に答える