ВНУТРЕННЕЕ СОЕДИНЕНИЕ на наибольшую ценность - PullRequest
3 голосов
/ 13 сентября 2011

Мне интересно, возможно ли внутреннее объединение по значению greates.

Так, например,

SELECT *
FROM Vehicle v
INNER JOIN VehicleCost vc ON v.VehicleWeight > vc.WeightFrom AND c.VehicleWeight < vc.WeightTo

Но если v.VehicleWeightTotal> v.VehicleWeight, я хочу заменить егоv.VehicleWight на внутреннем соединении.Таким образом, потенциально это может быть разное объединение для каждого транспортного средства.

Как мне провести проверку в объединении?

Пример:

tblVehicle
VehicleId  VehicleWeight VehicleWeightTotal 
1               12              15
2               1               8
3               16              20

tblVehicleCost
WeightFrom    WeightTo  Dollars
0               5         1
6               11        8
12              16        9 
17              20       15

Итак:

Vehicle 1 = 9
Vehicle 2 = 8
Vehicle 3 = 15

Ответы [ 3 ]

5 голосов
/ 13 сентября 2011

Ваши требования можно выразить проще:

использовать большее из VehicleWeight и VehicleWeightTotal при присоединении

Вот как вы выражаете это в SQL:

SELECT *
FROM Vehicle v
INNER JOIN VehicleCost vc 
   ON (case
         when VehicleWeightTotal > VehicleWeight then VehicleWeightTotal
         else VehicleWeight
       end) between vc.WeightFrom AND vc.WeightTo;

Я позволил себе сменить проверку диапазона, чтобы использовать between, но если это не подходит для сопоставления со значением, равным пределам диапазона - то есть с использованием >= и <= в вашем запросе, - тогда просто повторите case оператор для каждой стороны диапазона.

4 голосов
/ 13 сентября 2011
SELECT *
FROM Vehicle v
INNER JOIN VehicleCost vc ON 
  case when v.VehicleWeight > v.VehicleWeightTotal then v.VehicleWeight
       else v.VehicleWeightTotal end > vc.WeightFrom 
  AND case when v.VehicleWeight > v.VehicleWeightTotal then v.VehicleWeight
       else v.VehicleWeightTotal end < vc.WeightTo
0 голосов
/ 13 сентября 2011

Вы можете использовать производную таблицу, чтобы определить столбец для большего веса между VehicleWeight и VehicleWeightTotal в качестве выражения CASE. Таким образом, вам не придется повторять длинное выражение в условии соединения:

WITH GreaterWeights AS (
  SELECT
    *,
    GreaterWeight = CASE
      WHEN VehicleWeightTotal > VehicleWeight THEN VehicleWeightTotal
      ELSE VehicleWeight
    END
  FROM Vehicle
)
SELECT *
FROM GreaterWeights v
  INNER JOIN VehicleCost vc ON v.GreaterWeight > vc.WeightFrom
                           AND v.GreaterWeight < vc.WeightTo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...