2014-10-21 6 views
1

Я пытаюсь вставить номера счетов из одной базы данных в другую. Новая база данных, invoiceNo является первичным ключом. В базе данных есть дубликаты номеров счетов. Я нашел дубликаты с помощьюВставить в таблицу SQL

SELECT SERIAL_NO, 
COUNT(*) as cnt  
FROM HISTORY_INCIDENTS 
group by SERIAL_NO having COUNT(*) > 1 
order by COUNT(*) desc 

Я хотел бы поместить -1 в конце второго счета, таким образом они будут уникальными. Не знаете, как сделать это SQL

+1

является текстовым полем 'SERIAL_NO' (char, varchar, ...)? – Barranka

+0

Вы только когда-либо имеете ** 1 дубликат **? – christiandev

+0

Serial_no - это int. Да, существует не более 1 дубликата –

ответ

2

Вы можете использовать CTE, как это ...

; 
WITH cteDups 
      AS (SELECT SERIAL_NO , 
         RN = ROW_NUMBER() OVER 
       (PARTITION BY SERIAL_NO ORDER BY SERIAL_NO) 
       FROM  HISTORY_INCIDENTS 
      ) 
    SELECT CASE RN 
       WHEN 2 THEN SERIAL_NO + '-1' 
       ELSE SERIAL_NO 
      END AS SERIAL_NO 
    FROM cteDups 

fiddle см. Это создаст номер строки , когда есть дубликат, то вы можете использовать CASE, чтобы проверить наличие -й лет, и назначить -1 к этой записи.

EDIT: на основе комментариев

DECLARE @HISTORY_INCIDENTS TABLE (SERIAL_NO INT); 
DECLARE @NewHISTORY_INCIDENTS TABLE (SERIAL_NO VARCHAR(10)); 

INSERT INTO @HISTORY_INCIDENTS 
     (SERIAL_NO) 
VALUES (1); 
INSERT INTO @HISTORY_INCIDENTS 
     (SERIAL_NO) 
VALUES (2); 
INSERT INTO @HISTORY_INCIDENTS 
     (SERIAL_NO) 
VALUES (2); 
INSERT INTO @HISTORY_INCIDENTS 
     (SERIAL_NO) 
VALUES (2); 

; 
WITH cteDups 
      AS (SELECT SERIAL_NO , 
         RN = ROW_NUMBER() OVER (PARTITION BY SERIAL_NO 
                  ORDER BY SERIAL_NO) 
       FROM  @HISTORY_INCIDENTS 
      ) 
    INSERT INTO @NewHISTORY_INCIDENTS 
      (SERIAL_NO 
      ) 
      SELECT CASE RN 
         WHEN 2 THEN CAST(SERIAL_NO AS VARCHAR(10)) + '-1' 
         ELSE CAST(SERIAL_NO AS VARCHAR(10)) 
        END AS SERIAL_NO 
      FROM cteDups 

SELECT SERIAL_NO 
FROM @NewHISTORY_INCIDENTS 
+0

@paqogomez Это выберет все записи из исходного БД и добавит ** - 1 ** к дублированным записям. – christiandev

+0

@paqogomez, из этого: * Я пытаюсь вставить номера счетов из одной базы данных в другую *, я полагал, что требуется запрос для передачи данных с одного db на другой с помощью запроса? – christiandev

+0

@ user3385991 это ваш ответ, пожалуйста, не забывайте отмечать его как таковое и upvote! – paqogomez

0

Я думаю, что это будет работать.

Я использовал функцию ROW_NUMBER(), чтобы рассчитать количество раз, когда серийный номер произошел во внутренней производной таблице. В основном запросе я принимаю решения о том, как создавать новый серийный номер в зависимости от количества найденных явлений.

PS: сделано без редактора SQL.

SELECT 
    SERIAL_NO 
    ,SERIAL_NO + CASE WHEN [SERIAL_NO_Occurrence] > 1 THEN '-' + CAST([SERIAL_NO_Occurrence]-1 AS VARCHAR) ELSE '' END AS [SERIAL_NO_New] 
FROM (

    -- inner derived table to select number of occurrences of each serial number 
    SELECT  SERIAL_NO 
       ,ROW_NUMBER() OVER (
        PARTITION BY SERIAL_NO 
        ORDER BY SERIAL_NO -- you should also have a PK field here to have deterministic results I think 
       ) AS [SERIAL_NO_Occurrence] 
    FROM  HISTORY_INCIDENTS 
) AS T1; 
Смежные вопросы