如果列值为NULL,如何在连接中选择一列而不是另一列?

时间:2018-10-19 13:52:56

标签: sql sql-server join

我正在使用sql server和ANSI-89标准。

  1. 我想在每个订单项上显示运输类型名称以及商品详细信息
  2. 可以在订单或单个订单项上设置运输代码。
  3. 订单项上的运输代码(如果存在)在订单表上(如果存在)之前。
  4. 如果在Order或OrderItem上未设置运输代码,我仍然需要检索订单商品。

transport type是与transporttypecode上的运输表的联接。 订单或订单项与运输代码上的运输表结合在一起。

我如何进行条件连接,如果可以获取每个订单商品的运输类型名称,那么这里使用的正确方法是什么,这样我就可以相应地选择order或order_item上的transport_code并进行运输桌子?

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

样品数据

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

输出

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 :(得分:1)

一种方法在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;