【发布时间】:2015-09-30 01:28:49
【问题描述】:
我有一个表格,用于存储特定软件版本的兼容性。例如客户端的版本是否与后端兼容。有一个下限和一个上限,两者都有主要、次要和修订版本号。上限数字可以为空(有一个检查约束可确保它们全部或都不为空)。
我想创建一个查询,它返回各种majorVersion、minorVersion 和revisionVersion 编号的行。 示例(省略了 clientId 以使其更简单):
minMajorVersion | minMinorVersion | minRevisionVersion | maxMajorVersion | maxMinorVersion | maxRevisionVersion
1 0 0 NULL NULL NULL
1 2 5 NULL NULL NULL
1 3 0 NULL NULL NULL
2 0 1 5 1 0
假设我想知道哪个客户端版本与后端版本 1.2.6 兼容。为此,查询应返回前两行,因为最小版本较小,而最大版本为 NULL。 对于另一个后端版本 2.0.1,查询应该返回最后一行,而对于后端版本 5.2.0,查询应该不返回任何内容。
我能够创造的是这样的:
SELECT c.* FROM COMPATIBILITYQUALIFIER q
join client c on (c.id = q.clientid)
WHERE (q.MINBACKENDMAJORVERSION < 2
OR (q.MINBACKENDMAJORVERSION = 2 AND q.MINBACKENDMINORVERSION < 3)
OR (q.MINBACKENDMAJORVERSION = 2 AND q.MINBACKENDMINORVERSION = 3 AND q.MINBACKENDREVISIONVERSION <=6))
AND ((q.MAXBACKENDMAJORVERSION IS NULL)
OR ((q.MAXBACKENDMAJORVERSION > 2)
OR (q.MAXBACKENDMAJORVERSION = 2 AND q.MAXBACKENDMINORVERSION > 3)
OR (q.MAXBACKENDMAJORVERSION = 2 AND q.MAXBACKENDMINORVERSION = 3 AND q.MAXBACKENDREVISIONVERSION >= 6)))
order by c.MAJORVERSION DESC, c.MINORVERSION DESC, c.REVISIONVERSION DESC;
我不认为它会是高性能的。 一种简单的方法是创建一个存储过程,但我现在不想将代码放入数据库中。
有没有办法用子查询来做到这一点?还有什么快的吗?
已更新。
【问题讨论】:
-
没有实际的表+数据定义+你尝试过的查询,很难给出正确的答案。
-
您的要求不明确。请提供示例数据并更好地描述您要解决的问题。
-
@sstan 谢谢,你们都是对的。抱歉,当我发布问题时我有点累了。现在我更新了,请再看看。
-
@Sentinel 你能再看看我的问题吗?我更新了。