1

バージョン内で有効だったプロパティを見つけようとしている状況があります。以下にバージョン テーブルとプロパティ テーブルがあります。プロパティ レコードには、導入されたバージョンと削除されたバージョンがあります。

導入されたものと削除されたものの間にあるプロパティを選択しようとしています。ただし、削除されたものはnullであり、結合が混乱します。以下のSQLで(醜い方法で)補償しました。削除された in が null の場合、int の最大値を設定します。これは機能しますが、Removed In が null の場合、結合の 2 番目の条件を無視すると便利です。何かご意見は?

**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
4

1 に答える 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

値はそれ自体と等しいため、それ自体と別の値の「間」にあるため、これは機能します。

于 2013-04-25T15:13:28.707 に答える