SQL查询以最近的值连接两个表

时间:2015-07-14 18:57:49

标签: sql-server join

“>”我在前两张图片中有如下所示的数据。

dbo.Value1:     ID       Value       Date
                349383   -3268.32    7/14/2015
                573832   -1732.24    7/14/2015
                747583    49.85      7/14/2015
                958383    231.36     7/14/2015
                172737    1734.94    7/14/2015
                593983    25908.29   7/14/2015

dbo.ProductValue: ProductID  ProductValue   UploadDate
                  NULL       -6348          7/14/2015
                  958383      232           7/14/2015
                  172737      1735          7/14/2015
                  NULL        15392         7/14/2015

我想基于Value和Product Value列完全连接两个表,以便两个表基于最接近的值连接,如下所示。有谁知道我怎么能这样做?

enter code here: ID      Value      Date        ProductID   ProductValue    UploadDate
                 349383 -3268.32    7/14/2015   NULL        -6348           7/14/2015
                 573832 -1732.24    7/14/2015   NULL         NULL           NULL
                 747583  49.85      7/14/2015   NULL         NULL           NULL
                 958383  231.36     7/14/2015   958383       232            7/14/2015
                 172737  1734.94    7/14/2015   172737       1735           7/14/2015
                 593983  25908.29   7/14/2015   NULL         15392          7/14/2015

1 个答案:

答案 0 :(得分:1)

不完全确定你要查找的是什么,但是这将匹配第二个表id vs productid中的行,如果productid为null,那么它将匹配所有行,并且行匹配最低价值与产品价值之间的差异是指定的价值。

select *
from
  value v
  outer apply (
    select top 1 *, abs(p.productvalue - v.value) as diff
    from productvalue p
    where (p.productid = v.id or p.productid is null)
    and not exists (select 1 from value v2 where 
        (p.productid = v2.id or p.productid is null) and
        abs(p.productvalue - v.value) > abs(p.productvalue - v2.value))
    order by case when p.productid is null then 2 else 1 end,
      abs(p.productvalue - v.value) asc
  ) p

使用order by的外部应用将选择最匹配的行,其中的not exists子句只会将其与具有最接近产品值的行匹配。

您可以在SQL Fiddle

中对此进行测试