0

エラーが表示されます: ORA-01791: このクエリを実行しようとすると、SELECT された式ではありません。SELECT がコンマ区切り (AH.NAME、REPLACE(A.ACTIVE_DC、'、'、'/') など) の場合に実行できますが、 ||','|| 私はそれを働かせることができません。このクエリを実行するにはどうすればよいですか? ありがとう!

SELECT DISTINCT
    AH.NAME_1||','||
    REPLACE(A.ACTIVE_DC,',','/')||','||
    REPLACE(A.PASSIVE_DC,',','/')||','||    
    REPLACE(H.ENVIRONMENT,',','/')||','||
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x')||','||
    H.FULL_NAME||','||
    H.PRIMARY_IP||','||
    H.COMPLIANCE||','||
    H.OS
FROM
    HOST H
FULL OUTER JOIN
    APP_HOST AH ON
        AH.ID_2 = H.ID
FULL OUTER JOIN
    HOST_SVR HS ON
        HS.ID_1 = H.ID
FULL OUTER JOIN 
    APP A ON
        AH.ID_1 = A.ID          
FULL OUTER JOIN
    SVR S ON
        HS.ID_2 = S.ID     
WHERE S.NAME IS NOT NULL     
ORDER BY
    AH.NAME_1,
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x'),
    H.FULL_NAME
4

4 に答える 4

1

selectパーツごとに複雑な式を配置するorder byか、逆REPLACE(REPLACE(S.NAME,',','-'),'_x','-x')に選択リストに式を追加する必要があります。

SELECT DISTINCT
    AH.NAME||','||
    REPLACE(A.ACTIVE_DC,',','/')||','||
    REPLACE(A.PASSIVE_DC,',','/')||','||    
    REPLACE(H.ENVIRONMENT,',','/')||','||
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x')||','||
    H.FULL_NAME||','||
    H.PRIMARY_IP||','||
    H.COMPLIANCE||','||
    H.OS
FROM
    HOST H
FULL OUTER JOIN
    APP_HOST AH ON
        AH.ID_2 = H.ID
FULL OUTER JOIN
    HOST_SVR HS ON
        HS.ID_1 = H.ID
FULL OUTER JOIN 
    APP A ON
        AH.ID_1 = A.ID          
FULL OUTER JOIN
    SVR S ON
        HS.ID_2 = S.ID     
WHERE S.NAME IS NOT NULL     
ORDER BY
    -- same as selected
    AH.NAME||','||
    REPLACE(A.ACTIVE_DC,',','/')||','||
    REPLACE(A.PASSIVE_DC,',','/')||','||    
    REPLACE(H.ENVIRONMENT,',','/')||','||
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x')||','||
    H.FULL_NAME||','||
    H.PRIMARY_IP||','||
    H.COMPLIANCE||','||
    H.OS

上記のクエリは、並べ替え順序が最初のクエリと異なるため、タスクの観点から間違った結果を生成します。

したがって、2番目のオプションを使用してください:

SELECT DISTINCT
    AH.NAME||','||
    REPLACE(A.ACTIVE_DC,',','/')||','||
    REPLACE(A.PASSIVE_DC,',','/')||','||    
    REPLACE(H.ENVIRONMENT,',','/')||','||
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x')||','||
    H.FULL_NAME||','||
    H.PRIMARY_IP||','||
    H.COMPLIANCE||','||
    H.OS,
    -- next from order by
    AH.NAME_1,
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x'),
    H.FULL_NAME
FROM
    HOST H
FULL OUTER JOIN
    APP_HOST AH ON
        AH.ID_2 = H.ID
FULL OUTER JOIN
    HOST_SVR HS ON
        HS.ID_1 = H.ID
FULL OUTER JOIN 
    APP A ON
        AH.ID_1 = A.ID          
FULL OUTER JOIN
    SVR S ON
        HS.ID_2 = S.ID     
WHERE S.NAME IS NOT NULL     
ORDER BY
    AH.NAME_1,
    REPLACE(REPLACE(S.NAME,',','-'),'_x','-x'),
    H.FULL_NAME

2 番目のバリアントが機能するのは、すべてのorder by式が構築された文字列に含まれており、最初のバリアントよりも明確な値を生成できないためです。

ただし、フィールドが 1 つだけの結果セットを生成する場合は、サブクエリを使用して 2 つの手順でそれを行う必要があります。

  select 
    full_string
  from (
    SELECT DISTINCT
        (
          AH.NAME||','||
          REPLACE(A.ACTIVE_DC,',','/')||','||
          REPLACE(A.PASSIVE_DC,',','/')||','||    
          REPLACE(H.ENVIRONMENT,',','/')||','||
          REPLACE(REPLACE(S.NAME,',','-'),'_x','-x')||','||
          H.FULL_NAME||','||
          H.PRIMARY_IP||','||
          H.COMPLIANCE||','||
          H.OS
        ) as full_string,
        -- next from order by
        AH.NAME_1,
        REPLACE(REPLACE(S.NAME,',','-'),'_x','-x') S_NAME_REPLACE,
        H.FULL_NAME,
    FROM
        HOST H
    FULL OUTER JOIN
        APP_HOST AH ON
            AH.ID_2 = H.ID
    FULL OUTER JOIN
        HOST_SVR HS ON
            HS.ID_1 = H.ID
    FULL OUTER JOIN 
        APP A ON
            AH.ID_1 = A.ID          
    FULL OUTER JOIN
        SVR S ON
            HS.ID_2 = S.ID     
    WHERE S.NAME IS NOT NULL     
  )
  ORDER BY
      NAME_1,
      S_NAME_REPLACE,
      FULL_NAME

最終クエリに集計式がないため、機能します。

その図は、この SQLFiddleにあります。

于 2013-06-13T16:13:18.317 に答える