修改以更准确地表示我想要解决的问题。我第一次简化了这个问题。
我有2个SQL Server 2012表,其数据如下:
表CommitBranch
Hash HashDate BranchName
-----------------------------------------------------------------------------------
4191737d919e599690a8b9efd691ffc5165908f9 2013-01-26 15:24:44.000 B1
4191737d919e599690a8b9efd691ffc5165908f9 2013-01-26 15:24:44.000 B2
59503c5e22914b4926e8b5352ef254ebf67b1245 2013-01-28 19:28:12.000 B1
b3052d0c950a731d7221bab8825ba5787a9eb372 2013-01-29 17:05:02.000 B1
54752ce05b2c7784ff22c6161f9ecc33d4b1149f 2013-01-29 17:42:16.000 B2
d7c008d807d3439539b98dccf4c93ee6bc33405c 2013-01-29 21:29:32.000 B1
c890ca6ab1735ee391407ca80aa789a560632709 2013-01-31 04:39:57.000 B2
bf75a42b88782b0dc084a5642cc98876ad3ef41d 2013-01-31 04:41:30.000 B3
e54982d42d2b87e35d47536cd2017c18117afc28 2013-01-31 15:54:20.000 B1
e54982d42d2b87e35d47536cd2017c18117afc28 2013-01-31 15:54:20.000 B2
e54982d42d2b87e35d47536cd2017c18117afc28 2013-01-31 15:54:20.000 B3
Hash和BranchName是主键。
表格构建
BuildID LastCommitHash BranchName
------------------------------------------------------------
1 4191737d919e599690a8b9efd691ffc5165908f9 B1
2 b3052d0c950a731d7221bab8825ba5787a9eb372 B1
3 e54982d42d2b87e35d47536cd2017c18117afc28 B1
4 bf75a42b88782b0dc084a5642cc98876ad3ef41d B3
LastCommitHash是在创建Build时使用的CommitBranch记录的哈希值。请注意,并非每个Commit哈希都会出现在Build表中 - 如示例所示,将存在间隙(例如,缺少59503c5e22914b4926e8b5352ef254ebf67b1245)。对于CommitBranch表唯一可靠的排序是HashDate - 散列本身实际上是随机的。
我正在尝试编写一个在名为BuildCommit的视图中使用的查询,以便在Build表中的LastCommitHash和Previous Build的LastCommitHash之间提供所有的CommitBranch记录(但不包括该构建)。我基本上试图回答这个问题,自上次构建以来,该分支上的提交是什么。
查询将返回以下内容:
BuildID CommitHash BranchName
------------------------------------------------------------------
1 4191737d919e599690a8b9efd691ffc5165908f9 B1
2 b3052d0c950a731d7221bab8825ba5787a9eb372 B1
2 59503c5e22914b4926e8b5352ef254ebf67b1245 B1
3 e54982d42d2b87e35d47536cd2017c18117afc28 B1
3 d7c008d807d3439539b98dccf4c93ee6bc33405c B1
4 bf75a42b88782b0dc084a5642cc98876ad3ef41d B3
...
必须处理边缘条件(例如,只有1个分支构建,因此没有"因为"记录)。
迄今为止的答案都很有帮助和赞赏,但遗憾的是,由于我过度简化了原始问题,因此我所需要的并不完全。
提前致谢!
答案 0 :(得分:1)
试试这个
open("/dev/chardevice", "r+b", 0)
答案 1 :(得分:1)
您可以执行以下操作。根据需要修改此查询
DECLARE @StartHash char(40) = 'bf75a42b88782b0dc084a5642cc98876ad3ef41d'
DECLARE @EndHash char(40) = 'b3052d0c950a731d7221bab8825ba5787a9eb372'
;WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(ORDER BY H.HashDate) N
FROM HASHTABLE H
)
SELECT [Hash], [HashDate]
FROM CTE
WHERE EXISTS(SELECT 1 FROM CTE CMAX WHERE CMAX.[Hash] = @EndHash AND CMAX.N <= CTE.N)
AND EXISTS(SELECT 1 FROM CTE CMIN WHERE CMIN.[Hash] = @StartHash AND CMIN.N >= CTE.N)