2013-04-25 29 views
1

我遇到了一種情況,我試圖找到在版本中有效的屬性。我有一個版本表和屬性表下面。財產記錄有一個版本,他們被介紹和刪除英寸如何處理表中的可空列加入

我想選擇之間的介紹和刪除的屬性。刪除是空然而,這混亂了我的加入。我用下面的SQL補償了(以醜陋的方式)。如果刪除的是null,我將它設置爲int的最大值。這可以工作,但當Removed In爲null以忽略連接中的第二個限定條件時會很好。有什麼想法嗎?

**Version** 
    id  Name 
    ---  ----------------- 
    1   VersionA 
    2   VersionB 

**Property** 
    id   Name    IntroducedInVersion  RemovedInVersion 
    ---   ----------------- -------------------  ----------------- 
    1    Property1  1      null 
    2    Property2  1      2 


SELECT 
    p.PropertyName 
    ,p.IntroducedInVersion 
    ,p.RemovedInVersion 
FROM 
    Version v 
    join Property p on p.IntroducedInVersion <= v.Id 
     and ISNULL(cp.RemovedInVersion, 2147483647) > v.Id 
WHERE 
    v.Id = 1 

回答

1

你可以這樣做:

SELECT 
    p.PropertyName 
    ,p.IntroducedInVersion 
    ,p.RemovedInVersion 
FROM Version v 
join Property p 
    on (RemovedInVersionp is null 
    and v.id > IntroducedInVersion) 
    or 
    v.id between IntroducedInVersion 
     and RemovedInVersion - 1 
WHERE v.Id = 1 

但我認爲它不會因爲你的原始查詢執行爲好。

一個更好的選擇是這樣的:

SELECT 
    p.PropertyName 
    ,p.IntroducedInVersion 
    ,p.RemovedInVersion 
FROM Version v 
join Property p 
    on v.id between IntroducedInVersion 
     and ifnull(RemovedInVersion - 1, v.id) 
WHERE v.Id = 1 

其中一期工程,因爲值等於本身,所以這將是自己和另一個值「之間」。

+0

Thanks @Bohemian我認爲這將工作,如果我改變這個「ifnull(RemovedInVersion,v.id)」爲「ifnull(RemovedInVersion - 1,v.id)」。我不希望RemovedInVersion是包容性的。 – WayneB 2013-04-25 18:35:19