简体   繁体   English

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

[英]How to choose one column over another in a join if the column value is NULL?

I am using sql server and using ANSI-89 standard. 我正在使用SQL Server和ANSI-89标准。

  1. I want to show the transport type name on each of the orderitems along with the item details 我想在每个订单项上显示运输类型名称以及项目详细信息
  2. the transport code can be set at the order or individual orderitem. 可以在订单或单个订单项上设置运输代码。
  3. The transport code on order item precedes the one on order table if its present. 订单项上的运输代码(如果存在)在一个订单表之前。
  4. If there is no transport code set on Order or OrderItem , i still need to retrieve the orderitem. 如果在Order或OrderItem上没有设置运输代码,我仍然需要检索订单商品。

transport type is a join with the transport table on transporttypecode. 运输类型是与运输类型代码上的运输表的联接。 the order or orderitem is joined with the transport table on transportcode. 订单或订单项与运输代码上的运输表结合在一起。

How do I do a conditional join, if that is possible to get the transport type name for each order item, what is the right approach to use here so that I can pick the transport_code on order or order_item accordingly and join with transport table? 我如何进行条件联接,如果可以获取每个订单商品的运输类型名称,那么在这里可以使用什么正确的方法,以便我可以相应地选择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

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    

One method uses coalesce() in the on clause: 一种方法在on子句中使用coalesce()

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM