2017-01-16 33 views
1

Я создаю представление, используя этот запрос. Этот запрос работает, однако он приводит к появлению 2 строк для каждого из значений, возвращаемых из каждой объединенной таблицы. Как я могу получить 1 строку?Уникальный идентификатор подзапроса SQL Union - возвращает двойные результаты

ROW_NUMBER() OVER (ORDER BY A.ID) AS ID часть потому, что мне нужен уникальный идентификатор. (Есть ли лучший способ сделать это?)

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 вместо UNION ALL. Произведение UNION - это отличный результат. –

ответ

0

Try использование SELECT DISTINCT вместо просто SELECT.

Запросы союза производят различные строки по умолчанию; добавление DISTINCT изменит это.