tsql - 具有特殊格式的 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
解决方案
您需要FULL OUTER JOIN
同时使用OrderID
和LineOrd
。并用于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)
推荐阅读
- python - 如何使用 OpenCV 在蒙版区域中插入视频(mp4 文件)
- excel - 更改整个工作簿的所有 Msgboxes 的标题
- formula - LibreOffice:如何根据条件增加数字
- php - 如何检查数据库中是否存在元素并返回警告消息?
- google-cloud-vision - 限制 Google Cloud Vision 的字符集
- pine-script - pine脚本如何在每个会话开始时将barssince重置为零
- java - Java - 使用泛型类型
- sql-order-by - Keep the first row id using qualify in Teradata
- c++ - GTests not showing in VS19 test explorer
- node.js - 节点/快递:GET 请求 - 304