2017-01-30 6 views
1

論理に基づいて2つのテーブルを結合しようとしていますが、最初のテーブルの各レコードが結合を使用して2番目のテーブルの数値に< =の値を引きます。これがSQLで効率的に達成できるのであれば私は不思議です。私は日付に焦点を当てたいくつかの質問を見つけましたが、全く同じものはありません。SQL JOINの値が数値以下です

私は2つのテーブルを持っています。 「表1」は、プライマリ・テーブルである

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

「表2は」

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

ルックアップテーブルであり、結果は重量のために表2から最も近いコストを適用する< =表1

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

希望の結果を得るために、上記のクエリに変更を加えたいと考えています。

FYI:私はあなたが条件に一致する最初のレコードを探す必要のMicrosoft SQL Serverに2014

答えて

2

を使用しています:

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 
0

は、これはあなたが始める必要があります。

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 
関連する問題