这是我的表结构:
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列中的其他值应为NULL):
如何摆脱额外的行?
这是最终正确的脚本:
;使用cte1 AS(SELECT T_ActionTicketLog.ActionTicketID,T_ActionTicketLog.TicketOrderID,T_ActionTicketLog.StatusID,T_ActionTicketLog.Created, 状态IN IN(3,10)然后1 ELSE 0 结束 * ROW_NUMBER()OVER(T_ActionTicketLog.ActionTicketID,T_ActionTicketLog.StatusID ORDER BY T_ActionTicketLog.Created) 来自T_ActionTicketLog LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID ) CTE2 AS(SELECT ActionTicketID,OrderTicketID,TicketBarCode, ROW_NUMBER()OVER(由ActionTicketID ORDER BY创建的PARTITION)AS rn 来自T_TicketPrint ) SELECT c1.ActionTicketID,c1.StatusID,oa.TicketBarCode 来自cte1 c1 外部申请(选择* 来自cte2 c2 WHERE c1.ActionTicketID = c2.ActionTicketID AND c1.TicketOrderID = c2.OrderTicketID AND c1.rn = c2.rn )oa 其中c1.ActionTicketID = 24014999 按c1.Created排序
答案 0 :(得分:0)
如果我找到了你,你需要申请第一对(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
Ouptut:
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