2017-01-16 15 views
1

이 쿼리를 사용하여 뷰를 만들고 있습니다. 이 쿼리는 작동하지만 각 결합 테이블에서 반환 된 각 값에 대해 2 행이됩니다. 1 행을 얻으려면 어떻게해야합니까?SQL Union 하위 쿼리 고유 ID - 결과가 두 번 반환됩니다.

ROW_NUMBER() OVER (ORDER BY A.ID) AS ID 부분은 고유 한 ID가 필요하기 때문입니다. (그렇게 할 수있는 더 좋은 방법이 있나요?) SELECT DISTINCT 대신 단지 SELECT

SELECT Row_number() 
     OVER (
     ORDER BY A.ID) AS ID, 
     ALIAS_CKT_ID, 
     peg_site_id, 
     circuit_id, 
     LOC_A_ADDRESS, 
     CKT_ORDER, 
     CKT_STATUS, 
     PROD_DESCRIPTION, 
     customer_code, 
     CUSTOMER_ID, 
     CUSTOMER_NAME, 
     CKT_LOCATION_Z, 
     network, 
     market, 
     Source 
FROM (SELECT circ.id, 
      NULL     AS 'ALIAS_CKT_ID', 
      peg_site_id,   
      circuit_id   AS 'CIRCUIT_ID', 
      NULL     AS 'LOC_A_ADDRESS', 
      NULL     AS 'CKT_ORDER', 
      NULL     AS 'CKT_STATUS', 
      NULL     AS 'PROD_DESCRIPTION', 
      circ.customer_code, 
      NULL     AS 'CUSTOMER_ID', 
      cust.company   AS 'CUSTOMER_NAME', 
      NULL     AS 'CKT_LOCATION_Z', 
      network, 
      Cast(circ.market AS VARCHAR(max)) AS market, 
      'PEG'        AS 'Source' 
    FROM dbo.peg_circuit_network_data circ 
      LEFT JOIN dbo.peg_customers cust 
        ON cust.customer_code = circ.customer_code 
    UNION ALL 
    SELECT cv.id, 
      ALIAS_CKT_ID, 
      CKT_LOCATION_Z AS 'peg_site_id', 
      CIRCUIT_ID, 
      LOC_A_ADDRESS, 
      CKT_ORDER, 
      CKT_STATUS, 
      PROD_DESCRIPTION, 
      cv.CUSTOMER_CODE AS customer_code, 
      CUSTOMER_ID, 
      cust.company  AS 'CUSTOMER_NAME', 
      CKT_LOCATION_A, 
      NULL    AS 'network', 
      NULL    AS 'market', 
    FROM dbo.tc_cv_circuit_network cv 
      LEFT JOIN dbo.peg_customers cust 
        ON cust.customer_code = cv.customer_code 
    UNION ALL 
    SELECT NULL    AS 'id', 
      NULL    AS 'ALIAS_CKT_ID', 
      a_peg_site_id  AS 'peg_site_id', 
      peg_circuit_id  AS 'CIRCUIT_ID', 
      a_address   AS 'LOC_A_ADDRESS', 
      NULL    AS 'CKT_ORDER', 
      order_status  AS 'CKT_STATUS', 
      product_type  AS 'PROD_DESCRIPTION', 
      customer_code  AS customer_code, 
      NULL    AS CUSTOMER_ID, 
      customer_short  AS 'CUSTOMER_NAME', 
      NULL    AS CKT_LOCATION_A, 
      NULL    AS 'network', 
      Cast(market AS VARCHAR(max)) AS market, 
    FROM Openquery(crltoolsp01, 
LEFT JOIN crm ON cpm.customer_short=crm.company 
WHERE cpm.product_type="Dark Fiber";')) A 
+0

아마도 LEFT JOIN이 문제 일 수 있습니다. 결합은 다중화처럼 동작합니다. –

+0

데이터베이스 관리자 프로그램 (MySQL, SQL Server 등)에 대한 태그를 추가하십시오. 특히'Row_Number() '의 경우 이것은 중요 할 수 있습니다. – Smandoli

+0

아마도 그렇지 않습니다. UNION ALL 대신 UNION을 시도하십시오. UNION의 결과물은 뚜렷한 결과 집합입니다. –

답변

0

에 한번 사용.

연합 쿼리는 기본적으로 별개의 행을 생성합니다. DISTINCT을 추가하면이 값이 변경됩니다.