IF ELSE для условий присоединения?

Я использую SQL Server.

У меня есть таблица item_table вот так:

item   age
--------------    
1      1 
1      6 
2      2    

У меня есть другая таблица price_table вот так:

item    pricetype    price
--------------------------    
1       O             5
1       P             6
1       V             7
2       O             8
2       P             9
2       V             10

Итак, я хочу выполнить внутреннее соединение над двумя таблицами.

select *
from item_table i
inner join price_table p
on ...

Есть некоторые условия относительно on:

  1. если средний возраст элемента больше 3, то я делаю: inner join price_table on pricetype = 'O' or pricetype = 'P'
  2. Если нет, то делаю: inner join price_table on pricetype = 'O' or pricetype = 'P' or pricetype = 'V'

Итак, есть условия для on условий.

Как написать запрос выбора?

Изменить: я изменил условие на средний возраст вместо type.


person Jackson Tale    schedule 06.11.2012    source источник
comment
Вы хотите, чтобы объединение возвращало несколько строк для каждой строки в вашей таблице?   -  person Mark Byers    schedule 06.11.2012
comment
Вы можете использовать оператор case или производный запрос. Вы можете пересмотреть свою модель данных? Производительность запросов всегда будет выше, если ваши соединения будут проще. Иногда это того стоит, даже если у вас есть избыточность данных.   -  person Shan Plourde    schedule 06.11.2012


Ответы (3)


select i.item, i.type, p.pricetype, p.price
from item_table i
inner join price_table p on i.item = p.item 
    and (i.type = 1 and p.pricetype in ('O', 'P'))
        or (i.type = 2 and p.pricetype in ('O', 'P', 'V'))

Пример скрипта SQL

Вывод:

| ITEM | TYPE | PRICETYPE | PRICE |
-----------------------------------
|    1 |    1 |         O |     5 |
|    1 |    1 |         P |     6 |
|    2 |    2 |         O |     5 |
|    2 |    2 |         P |     6 |
|    2 |    2 |         V |     7 |
|    2 |    2 |         O |     8 |
|    2 |    2 |         P |     9 |
|    2 |    2 |         V |    10 |
person D'Arcy Rittich    schedule 06.11.2012
comment
@ Бет Спасибо, меня прервали на середине ответа. - person D'Arcy Rittich; 06.11.2012

Я бы сам поместил это в предложение where, например:

select *
from item_table i
inner join price_table p on 
i.item = p.item
where
(pricetype in ('O', 'P'))
    or (type = 2 and pricetype in ('V'))
person Beth    schedule 06.11.2012
comment
В чем преимущество делать это таким образом? - person Patrick Honorez; 06.11.2012
comment
Для внутреннего соединения предложение on компилируется в предложение where при запуске (оба метода хороши, это просто забавный факт) - person Scott Chamberlain; 06.11.2012
comment
@iDevlop для внутренних соединений, преимущества чисто косметические. - person Scott Chamberlain; 06.11.2012

Один из подходов состоит в том, чтобы иметь таблицу, которая отображает два типа типов:

itemtype    pricetype
---------------------
1           O
1           P
2           O
2           P
2           V

Затем вы можете внутренне соединить эту таблицу с двумя другими.

person Neil    schedule 06.11.2012