Как выбрать один столбец над другим в соединении, если значение столбца равно NULL? - PullRequest
0 голосов
/ 19 октября 2018

Я использую sql server и использую стандарт ANSI-89.

  1. Я хочу показать название типа транспорта на каждом из элементов заказа вместе с деталями элемента
  2. код транспорта можно установить в заказе или в отдельном элементе заказа.
  3. Транспортный код в позиции заказа предшествует коду в таблице заказа, если он присутствует.
  4. Если для Order или OrderItem не задан транспортный код, мне все равно нужно получить элемент заказа.

тип транспорта - это соединение с таблицей транспорта на типе транспорта.заказ или элемент заказа объединяются с транспортной таблицей в транспортном коде.

Как выполнить условное объединение, если возможно получить имя транспортного типа для каждого элемента заказа, каков правильный подход для использования здесьчтобы я мог выбрать транспортный код для order или order_item соответственно и присоединиться к транспортной таблице?

Order
-----
orderNo (PK)
country NOT NULL
transportCode NULL

OrderItems
----------
OrderNo (PK)
orderItemNo (PK)
transport_code NULL


Transport
---------
trasportcode (PK)
transportname NOT NULL
transporttypecode NOT NULL

transportType
-------------
transporttypecode (PK)
transporttypename NOT NULL

SAMPLE DATA

Order 
    OrderNo   Country  TransportCode
    1             USA       ST1
    2             ENGLAND       

Order Item
    Order No orderItemNo itemname transportCode
    1            1         cooker    ST2
    1            2         scissor
    2            1         stapler
    2            2         pencil    ST3
    2            3         bottle    

Transport
    transportcode           name        transporttypecode
    ST1                 INS BUTTERFLY           W
    ST2                 LUFTHANSA               A
    ST3                 TRANS SIBERIAN RAIL     RL

TransportType
    Transporttypecode name
    W                 Water
    A                 Air
    RL                Rail

Output

Order No orderItemNo itemname    transportName      transporttypeName
1            1         cooker    LUFTHANSA                Air
1            2         scissor   INS BUTTERFLY           Water 
2            1         stapler
2            2         pencil    TRANS SIBERIAN RAIL     Rail
2            3         bottle    

1 Ответ

0 голосов
/ 19 октября 2018

Один метод использует coalesce() в предложении on:

select oi.*, t.transportName, t.transporttypeName
from orderitems oi join
     orders o
     on oi.ordernum = o.ordernum left join
     transport t
     on t.transportcode = coalesce(oi.transportcode, o.transportcode) left join
     TransportType tt
     on tt.Transporttypecode = t.Transporttypecode;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...