2017-01-30 7 views
1

Ich versuche, zwei Tabellen basierend auf Logik zu verbinden, wo jeder Datensatz aus der ersten Tabelle einen Wert < = zu einer Zahl in der zweiten Tabelle mithilfe einer Verknüpfung ziehen würde. Ich bin gespannt, ob dies in SQL effizient erreicht werden kann. Ich habe ein paar Fragen zu Daten gefunden, aber nichts ganz ähnliches.SQL-JOIN-Wert kleiner als oder gleich der Zahl

Ich habe zwei Tabellen. 'Tabelle 1' ist die primäre Tabelle

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

'Table2' wird die Lookup-Tabelle

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

Das Ergebnis wäre die nächsten Kosten von table2 für ein Gewicht < = Tabelle 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 | 
+---------+---------+--------+------+ 

gilt Bei Verwendung eines herkömmlichen Joins liefert die erste Zeile Kosten, da 600 ein Gewicht ist, das in "Tabelle2"

aufgeführt ist

Ich hoffe, Änderungen an der Abfrage oben, um das gewünschte Ergebnis zu erreichen.

Zur Info: Ich bin mit Microsoft SQL Server 2014

Antwort

2

Sie für den ersten Datensatz aussehen sollte, die die Bedingungen erfüllen:

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

Dies sollte Sie erhalten begonnen:

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 
Verwandte Themen