2010-03-04 23 views
2

數據庫中有一張表,我們稱之爲表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中實現的用於MS SQL Server 2005和2008年。我想,可能只佔非常繁瑣,低效和ureadable表達式。考慮到它在C#中看起來有多麼微不足道,我認爲我不能輕易做到這一點,因爲我並不熟悉SQL。

我正在尋找一種在SQL中執行此操作的方式,其複雜程度與C#中的複雜度相同。

對不起,我不知道如何概括這個問題。關於概括問題及其標題的建議也非常感謝。

UPDATE 對於那些誰不與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 
+0

你能用簡單的句子或僞代碼解釋規則嗎?我並不擅長LINQ ;-) –

+0

我剛剛意識到我的示例代碼中沒有LINQ,只是C#3擴展方法。編輯問題以符合此;)。 –

回答

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) 
+1

哇!看起來像TOP和ORDER BY做我不知道該怎麼做的工作!現在沒有時間,我會在代碼測試後投票或接受。 –

+1

是的,對於像1.1這樣的版本,您可以同時獲得1.2和2.0 --ORDER BY確保1.2先到達,然後TOP 1只抓取第一個記錄(1.2記錄)。您可以將其放入用戶定義的函數在SQL中,並將它分成兩個部分,就像你的LINQ一樣,但我認爲這樣更有效率。 –

+0

經過測試,它按照我的意願工作。謝謝! –

相關問題