Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何处理表联接中的可空列_Sql_Sql Server_Join_Null - Fatal编程技术网

Sql 如何处理表联接中的可空列

Sql 如何处理表联接中的可空列,sql,sql-server,join,null,Sql,Sql Server,Join,Null,我遇到的情况是,我试图查找版本中有效的属性。我在下面有一个版本表和属性表。属性记录具有在中引入和删除它们的版本 我正在尝试选择中引入和删除的属性之间的属性。然而,删除的是空的,这会扰乱我的加入。我用下面的SQL以一种丑陋的方式进行了补偿。如果删除的in为null,我将其设置为int的最大值。这是可行的,但如果删除的in为null,则最好忽略联接中的第二个限定。有什么想法吗 **Version** id Name --- -----------------

我遇到的情况是,我试图查找版本中有效的属性。我在下面有一个版本表和属性表。属性记录具有在中引入和删除它们的版本

我正在尝试选择中引入和删除的属性之间的属性。然而,删除的是空的,这会扰乱我的加入。我用下面的SQL以一种丑陋的方式进行了补偿。如果删除的in为null,我将其设置为int的最大值。这是可行的,但如果删除的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
您可以这样做:

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
这是因为一个值等于它自己,所以它将介于它自己和另一个值之间。

您可以这样做:

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

这是因为一个值等于它自己,所以它将介于它自己和另一个值之间。

谢谢@Bohemian我认为如果我将这个ifnullRemovedInVersion,v.id更改为ifnullRemovedInVersion-1,v.id,这将起作用。我不希望RemovedInVersion包含所有内容。谢谢@Bohemian,我认为如果我将这个ifnullRemovedInVersion,v.id更改为ifnullRemovedInVersion-1,v.id,这将有效。我不希望移除的反转包含所有内容。