首页 > 解决方案 > 具有特殊格式的 TSQL 完全连接

问题描述

我有一位好女士,她想要输出特定的格式,我发现它非常特别,虽然违反了常见规则,你能建议我是否可以用TSQL. 我粘贴了样本输入并想要输出。这是我认为的一种 FULL JOIN 但需要做更多的清洁,这里有点丢失。我的第一个项目。试图说服她使用 2 个单独的表进行输出以保持一定的完整性,但失败了,所以接受这个挑战)!LineOrd和之间没有关系LinePr。我用多个步骤组成了一些东西,但感觉应该比做 4-5 个步骤更优雅.. 最好

DROP TABLE If exists #o
CREATE TABLE #o (OrderID int,   LineOrd int,    ProductID int)
INSERT #o VALUES 
(111,   1,  10001),(2222,   1,  2001),(2222,    2,  2002),
(2222,  3,  2003),(3333,    1,  30001),(3333,   2,  30002)

DROP TABLE If exists #p
CREATE TABLE #p (OrderID int,   LinePr int, ProfileID CHAR(10))
INSERT #p VALUES 
(111,   1,  'alpha1'),(111, 2,  'bravo1'),
(2222,  1,  'charlie2'),(2222,  2,  'delta2'),
(3333,  1,  'echo3'),(3333, 2,  'hotel3')

--    select   * from #o;   select    * from #p

SELECT   
o.*, '--' f  
,p.LinePR, p.ProfileID
,ROW_NUMBER() OVER (PARTITION BY o.orderID, o.lineOrd ORDER BY lineOrd) rn
,ROW_NUMBER() OVER (PARTITION BY o.orderID, p.linePr  ORDER BY linePr ) rn2
,OrdMax = (SELECT MAX(lineOrd) FROM #o  o2 WHERE o2.OrderID = o.OrderID)
,PrMax = (SELECT MAX(linePr)   FROM #p  p2 WHERE p2.OrderID  = p.OrderID)
, 0 sw

FROM #o o
FULL JOIN #p p  ON p.orderID = o.OrderID
ORDER BY 1,2,5

-- need more cleaning 

样本输出

标签: tsql

解决方案


您需要FULL OUTER JOIN同时使用OrderIDLineOrd。并用于COALESCE()返回第一个不为空的列OrderID

SELECT  OrderID = COALESCE(o.OrderID, p.OrderID),
        o.LineOrd,
        o.ProductID,
        p.LinePr,
        p.ProfileID
FROM    #o o
FULL OUTER JOIN #p p    ON  p.OrderID = o.OrderID
                       AND  p.LinePr  = o.LineOrd
ORDER BY OrderID, 
         COALESCE(o.LineOrd, p.LinePr)

推荐阅读