通过不同的请求逐步查找表中的单个记录

时间:2010-03-04 14:45:41

标签: sql linq sql-server-2005

数据库中有一个表,让我们调用这个表Document。 该表包含字段:

  • MajorVersionNumber
  • MinorVersionNumber
  • RELEASEDATE

有确定版本顺序及其到期日期的规则。我将给出在C#3中查找版本的到期日期的规则,因为它看起来更容易用英语阅读。

        var nextMinorVersion = Versions.FirstOrDefault((version) =>
            (version.majorVersionNumber == currentVersion.majorVersionNumber) &&
            (version.minorVersionNumber == currentVersion.minorVersionNumber + 1));
        if (nextMinorVersion != null) return nextMinorVersion.ReleaseDate;
        var nextMajorVersion = Versions.FirstOrDefault((version) =>
            (version.majorVersionNumber == currentVersion.majorVersionNumber + 1) &&
            (version.minorVersionNumber == 0));
        if (nextMajorVersion != null) return nextMajorVersion.ReleaseDate;
        return null;

现在必须在SQL for MS SQL Server 2005和2008中实现此规则。我尝试过并且只能组成非常繁琐,低效且难以理解的表达式。考虑到它在C#中看起来有多么微不足道,我认为我不能轻易做到这一点因为我不熟悉SQL。

我正在寻找一种在SQL中执行此操作的方法,其复杂性与C#相同。

抱歉这么狭隘的问题,我不知道如何概括这一点。关于概括问题及其标题的建议也非常感谢。

更新 对于那些没有使用C#3灵巧的人,我将尝试用伪代码解释规则:

if exists nextMinorVersion so that
    nextMinorVersion.majorVersionNumber = currentVersion.majorVersionNumber and
    nextMinorVersion.minorVersionNumber = currentVersion.minorVersionNumber + 1
    then expirationDate = nextMinorVersion.ReleaseDate
else if exists nextMajorVersion so that
    nextMajorVersion.majorVersionNumber = currentVersion.majorVersionNumber + 1 and
    nextMinorVersion.majorVersionNumber = 0
    then expirationDate = nextMajorVersion.ReleaseDate
else expirationDate = null

1 个答案:

答案 0 :(得分:2)

我想我已经得到了它 - 比如:

SELECT TOP 1 ReleaseDate
FROM Versions
WHERE
    (MajorVersion = @CurrentMajor AND MinorVersion = @CurrentMinor + 1)
    OR (MajorVersion = @CurrentMajor + 1 AND MinorVersion = 0)
ORDER BY MajorVersion, MinorVersion

在我下面的测试数据中,任何1.x版本也检索2.0版本(因为它是一个OR子句),这是TOP 1和ORDER BY进入的地方 - 它只选择1.x记录,如果有的话之一。

如果版本是相互缠绕的(例如1.3在2.0之后发布),这也适用。

仅供参考我的表定义:

CREATE TABLE [dbo].[Versions](
    [MajorVersion] [int] NOT NULL,
    [MinorVersion] [int] NOT NULL,
    [ReleaseDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Versions] PRIMARY KEY CLUSTERED 
(
    [MajorVersion] ASC,
    [MinorVersion] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

插入一些数据:

INSERT INTO Versions VALUES (1, 0, '2009-01-01')
INSERT INTO Versions VALUES (1, 1, '2009-01-10')
INSERT INTO Versions VALUES (1, 2, '2009-01-21')
INSERT INTO Versions VALUES (2, 0, '2009-02-01')
INSERT INTO Versions VALUES (2, 1, '2009-02-20')
INSERT INTO Versions VALUES (1, 3, '2009-03-01')

尝试一下:

1.0 = 2009-01-10
1.1 = 2009-01-21
1.2 = 2009-03-01
1.3 = 2009-02-01
2.0 = 2009-02-20
2.1 = NULL (no rows)