【问题标题】:Insert into SQL table插入 SQL 表
【发布时间】:2014-10-21 20:01:23
【问题描述】:

我正在尝试将发票编号从一个数据库插入到另一个数据库。新数据库 invoiceNo 是主键。原始数据库中有重复的发票编号。我使用

找到了重复项
SELECT  SERIAL_NO,
COUNT(*) as cnt    
FROM HISTORY_INCIDENTS
group by SERIAL_NO having COUNT(*) > 1
order by COUNT(*) desc

我想在第二张发票的末尾加上 -1,这样它们就独一无二了。不知道如何做到这一点是 SQL

【问题讨论】:

  • SERIAL_NO 一个文本字段(char、varchar、...)?
  • 您是否最多只有 1 个重复项
  • Serial_no 是一个整数。是的,最多有 1 个重复项
  • 如果serial_no 是一个int,你想从中减去1吗?如果不是,您将值放在哪个字段中是 varchar 字段? (整数不能连接)

标签: sql sql-server sql-server-2008


【解决方案1】:

你可以使用这样的 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。当有重复时,这将创建 2 的行号,然后您可以使用 CASE 检查任何 2,并分配 - 1 到该记录。

编辑:基于评论

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

【讨论】:

  • @paqogomez 这将从源数据库中选择所有记录,并将 -1 附加到重复记录。
  • @paqogomez,来自:我正在尝试将发票号码从一个数据库插入另一个数据库,我认为需要查询才能从一个数据库中获取数据使用查询到另一个?
  • @user3385991 这是你的答案,请记得标记并点赞!
【解决方案2】:

我认为这会奏效。

我使用 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;

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2016-06-30
    • 2017-04-28
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多