Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何消除重复行?_Sql Server 2008 - Fatal编程技术网

Sql server 2008 如何消除重复行?

Sql server 2008 如何消除重复行?,sql-server-2008,Sql Server 2008,这是我的表格结构: 1当我使用此查询时: SELECT T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID --,case when (dbo.T_ActionTicketLog.StatusID <> 2 and dbo.T_ActionTicketLog.StatusID <> 6) then dbo.T_TicketPrint.TicketBarCode --else n

这是我的表格结构:

1当我使用此查询时:

SELECT  T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID
      --,case when (dbo.T_ActionTicketLog.StatusID <> 2 and dbo.T_ActionTicketLog.StatusID <> 6) then dbo.T_TicketPrint.TicketBarCode
      --else null end as TicketBarCode
FROM       T_ActionTicketLog
      LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID
      --LEFT OUTER JOIN T_TicketPrint ON T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID and T_OrderTicket.ID = T_TicketPrint.OrderTicketID
where T_ActionTicketLog.ActionTicketID = 24014999
一切正常,如下所示:

2但是,当我因为需要T_TicketPrint.TicketBarCode而使用此查询时:

SELECT  T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID
      ,case when (dbo.T_ActionTicketLog.StatusID <> 2 and dbo.T_ActionTicketLog.StatusID <> 6) then dbo.T_TicketPrint.TicketBarCode
      else null end as TicketBarCode
FROM       T_ActionTicketLog
      LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID
      LEFT OUTER JOIN T_TicketPrint ON T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID and T_OrderTicket.ID = T_TicketPrint.OrderTicketID
where T_ActionTicketLog.ActionTicketID = 24014999
我有额外的行,它如下所示:

这是T_TicketPrint表中的已售出门票。当车票处于卖出状态3时,可以打印出状态10。重要的是,当我们打印车票时,每次都会生成新的条形码。在这种情况下,我们有一张票被售出并打印了3次,带有3个不同的条形码

TicketBarCode列中的其他值应为空:

如何去掉多余的行

这是最终正确的脚本:

);使用cte1 选择T_ActionTicketLog.ActionTicketID、T_ActionTicketLog.TicketOrderID、T_ActionTicketLog.StatusID、T_ActionTicketLog.Created, 状态ID为3、10和1时的情况 其他0 终止 *按T_ActionTicketLog.ActionTicketID划分的分区上的行数,按T_ActionTicketLog.StatusID排序按T_ActionTicketLog.Created作为rn 来自T_ActionTicketLog T_ActionTicketLog.TicketOrderID=T_OrderTicket.ID上的左外部联接T_OrderTicket , cte2 选择ActionTicketID、OrderTicketID、TicketBarCode、, 按ActionTicketID创建为rn的分区上的行数 从T_TicketPrint 选择c1.ActionTicketID、c1.StatusID、oa.TicketBarCode 来自cte1 c1 外部应用选择* 来自cte2 c2 其中c1.ActionTicketID=c2.ActionTicketID和c1.TicketOrderID=c2.OrderTicketID和c1.rn=c2.rn 骨性关节炎 其中c1.ActionTicketID=24014999
按c1订购。已创建

如果我没弄错,您需要应用于第一对3,10第一个条形码,第二个条形码到第二对,依此类推。但目前尚不清楚这两对中的哪一对是第一对还是第二对

这是测试脚本:

DECLARE @actions TABLE
    (
      TicketID INT ,
      StatusID INT
    )
DECLARE @prints TABLE
    (
      TicketID INT ,
      BarCode NVARCHAR(MAX)
    )

INSERT  INTO @actions
VALUES  ( 1, 2 ),
        ( 1, 4 ),
        ( 1, 3 ),
        ( 1, 10 ),
        ( 1, 6 ),
        ( 1, 3 ),
        ( 1, 10 ),
        ( 1, 6 ),
        ( 1, 3 ),
        ( 1, 10 ),
        ( 1, 6 ),
        ( 1, 7 )


INSERT  INTO @prints
VALUES  ( 1, 'C1' ),
        ( 1, 'C2' ),
        ( 1, 'C3' );
WITH    cte1
          AS ( SELECT   * ,
                        CASE WHEN StatusID IN ( 3, 10 ) THEN 1
                             ELSE 0
                        END
                        * ROW_NUMBER() OVER ( PARTITION BY TicketID, StatusID ORDER BY StatusID ) AS rn
               FROM     @actions a
             ),
        cte2
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY TicketID ORDER BY BarCode ) AS rn
               FROM     @prints a
             )
    SELECT  c1.TicketID ,
            c1.StatusID ,
            oa.BarCode
    FROM    cte1 c1
            OUTER APPLY ( SELECT    *
                          FROM      cte2 c2
                          WHERE     c1.TicketID = c2.TicketID
                                    AND c1.rn = c2.rn
                        ) oa
乌普图特:

TicketID    StatusID    BarCode
1           2           NULL
1           3           C1
1           3           C2
1           3           C3
1           4           NULL
1           6           NULL
1           6           NULL
1           6           NULL
1           7           NULL
1           10          C1
1           10          C2
1           10          C3
比如:

;WITH    cte1
          AS ( SELECT    T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.OrderTicketID, T_ActionTicketLog.StatusID ,
                        CASE WHEN StatusID IN ( 3, 10 ) THEN 1
                             ELSE 0
                        END
                        * ROW_NUMBER() OVER ( PARTITION BY T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID ORDER BY T_ActionTicketLog.Created ) AS rn
               FROM       T_ActionTicketLog
               LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID
             ),

    cte2
      AS ( SELECT   ActionTicketID , OrderTicketID, TicketBarCode
                    ROW_NUMBER() OVER ( PARTITION BY ActionTicketID ORDER BY Created ) AS rn
           FROM     T_TicketPrint
         )
SELECT  c1.ActionTicketID, c1.StatusID , oa.TicketBarCode
FROM    cte1 c1
        OUTER APPLY ( SELECT    *
                      FROM      cte2 c2
                      WHERE     c1.ActionTicketID = c2.ActionTicketID AND c1.ID = c2.OrderTicketID AND c1.rn = c2.rn
                    ) oa

您是否尝试在第二次加入中添加和dbo.T_ActionTicketLog.StatusID=3或dbo.T_ActionTicketLog.StatusID=10?@tesicg,回答我们向您提出的问题,而不是开始新的问题。我重复我的问题:为什么第11、12行有197797471545,而第14、15行有197797473537?为什么不反过来呢?11, 12 197797473537; 14, 15 197797471545? 逻辑是什么?可能是@stb的重复:在这种情况下,状态2和6不会重复,这很好,但3和10仍在重复。@Giorgi Nakuri:这里解释得更好。上一个脚本中有很多错误。我不能运行它。我可以把条件放在哪里:ActionTicketID=24014999?您没有提供任何表结构。我闭着眼睛写代码。你期待什么?试着改正错误。或者把这些错误写在这里。我们不是万加斯。你可以把它放在最后。这里c1.ActionTicketID=24014999请看一下我更正的原始帖子。你更正了什么?我看不出有什么变化。我在这里做了一些改变。一切都在上面。