【问题标题】:SQL JOIN value less than or equal to numberSQL JOIN 值小于或等于数字
【发布时间】:2017-06-16 03:18:27
【问题描述】:

我正在尝试根据逻辑连接两个表,其中第一个表中的每条记录将使用连接将值

我有两张桌子。 'Table1' 是主表

**Table1**
+---------+---------+--------+
| Product | Carrier | Weight |
+---------+---------+--------+
| Z       | B       | 600    |
+---------+---------+--------+
| Z       | B       | 350    |
+---------+---------+--------+
| Y       | A       | 150    |
+---------+---------+--------+
| X       | A       | 75     |
+---------+---------+--------+
| Y       | B       | 10     |
+---------+---------+--------+
| X       | A       | 40     |
+---------+---------+--------+

'Table2'是查找表

**Table2**
+---------+--------+------+
| Carrier | Weight | Cost |
+---------+--------+------+
| A       | 50     | 2.50 |
+---------+--------+------+
| A       | 100    | 2.00 |
+---------+--------+------+
| A       | 200    | 1.75 |
+---------+--------+------+
| B       | 200    | 1.85 |
+---------+--------+------+
| B       | 400    | 1.50 |
+---------+--------+------+
| B       | 600    | 1.35 |
+---------+--------+------+

结果将应用与 table2 最接近的权重

**Result**
+---------+---------+--------+------+
| Product | Carrier | Weight | Cost |
+---------+---------+--------+------+
| Z       | B       | 600    | 1.35 |
+---------+---------+--------+------+
| Z       | B       | 350    | 1.50 |
+---------+---------+--------+------+
| Y       | A       | 150    | 1.75 |
+---------+---------+--------+------+
| X       | A       | 75     | 2.00 |
+---------+---------+--------+------+
| Y       | B       | 10     | 1.85 |
+---------+---------+--------+------+
| X       | A       | 40     | 2.50 |
+---------+---------+--------+------+

使用传统联接,第一行会产生成本,因为 600 是“表 2”中列出的权重

SELECT a.Product
      ,a.Carrier
      ,a.Weight
      ,b.Cost
FROM dbo.table1 a
LEFT JOIN Table2 b ON a.Carrier = b.Carrier AND a.Weight = b.Weight
+---------+---------+--------+------+
| Product | Carrier | Weight | Cost |
+---------+---------+--------+------+
| Z       | B       | 600    | 1.35 |
+---------+---------+--------+------+
| Z       | B       | 350    | NULL |
+---------+---------+--------+------+
| Y       | A       | 150    | NULL |
+---------+---------+--------+------+
| X       | A       | 75     | NULL |
+---------+---------+--------+------+
| Y       | B       | 10     | NULL |
+---------+---------+--------+------+
| X       | A       | 40     | NULL |
+---------+---------+--------+------+

我希望对上面的查询进行更改以达到预期的结果。

仅供参考:我使用的是 Microsoft SQL Server 2014。

【问题讨论】:

    标签: sql tsql join


    【解决方案1】:

    您应该寻找符合条件的第一条记录:

    SELECT a.Product
          ,a.Carrier
          ,a.Weight
          ,(select top 1 Cost from Table2 b
            where a.Carrier = b.Carrier AND a.Weight <= b.Weight
            ORDER BY b.Carrier, b.Weight ASC) Cost
    FROM dbo.table1 a
    

    【讨论】:

      【解决方案2】:

      这应该让你开始:

      with theCost as (
      select t1.carrier
      , min(t2.weight) thisWeight
      from table1 t1 join table2 t2 on t1.carrier = t2.carrier
      where whatever
      group by t1.carrier
      )
      select the field you want
      from theCost join table2 t2 on theCost.carrier = t2.carrier
          and thisWeight = t2.weight
      etc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2011-12-21
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多