oracle SQL Developer -如果第一次连接的输出为空,如何连接到另一个表?

ffscu2ro  于 2023-11-17  发布在  Oracle
关注(0)|答案(3)|浏览(123)

情况是这样的。我有一个库存表(inv),我想将它与入站发货表(inb)连接在一起,值shipping_id存储在两个表中。在'inb'表中存储值'origin',对于'inv'表中的每个记录,我想知道'origin'是什么。下面是一个例子:

SELECT
  invent.item_id,
  invent.location_id,
  invent.quantity,
  inbound.origin
FROM    
  inventory invent
LEFT JOIN inbound_shipments inbound
  ON invent.shipment_id = inbound.shipment_id

字符串
但是有些货件已经不在inbound_shipping表中了,已经移到了inbound_shipping_archive中。Given:对于每个shipping_id,inbound_shipping表或inbound_shipping_archive表中都有一条记录,所以如果连接列中返回的值为null,则它必须在另一个表中。

我的问题是:我如何才能使这个连接的方式,它将获得所需的值('origin')从这两个表到同一列?

我试过用相邻的列连接两个表。这很有效,如果没有其他选择,这是一个不错的选择

SELECT
  invent.item_id,
  invent.location_id,
  invent.quantity,
  inbound.origin,
  inboundarch.origin
FROM
  inventory invent
LEFT JOIN inbound_shipments inbound
  ON invent.shipment_id = inbound.shipment_id
LEFT JOIN inbound_shipments_archive inboundarch
  ON invent.shipment_id = inboundarch.shipment_id


谢谢你的时间

6qqygrtg

6qqygrtg1#

一个“干净”的方法来做到这一点将UNIONinbound_shipmentsinbound_shipments_archivea CTEJOIN到:

WITH inbound_shipments_combined AS
(
    SELECT * FROM inbound_shipments
    UNION
    SELECT * FROM inbound_shipments_archive
)
SELECT
    invent.item_id,
    invent.location_id,
    invent.quantity,
    inbound.origin
FROM    
    inventory invent
    LEFT JOIN inbound_shipments_combined inbound on invent.shipment_id = inbound.shipment_id

字符串
上面的示例假设inbound_shipmentsinbound_shipments_archive具有相同的模式-如果它们不具有相同的模式,仍然可以对它们进行UNION,但是您必须非常谨慎地从CTE中的每个组件表中选择字段。

hrysbysz

hrysbysz2#

您可以使用COALESCE从主发货表(如果有)返回值,或者从存档表(如果没有)返回值:
COALESCE返回表达式列表中的第一个非空 expr。您必须至少指定两个表达式。如果所有出现的 expr 计算为null,则函数返回null。
因此,与其在选择列表中同时包含两个表中的列,不如将它们替换为COALESCE的结果,并(可选地)给予该列表达式一个别名:

SELECT
  invent.item_id,
  invent.location_id,
  invent.quantity,
  COALESCE(inbound.origin, inboundarch.origin) AS origin
FROM
  inventory invent
LEFT JOIN inbound_shipments inbound
  ON invent.shipment_id = inbound.shipment_id
LEFT JOIN inbound_shipments_archive inboundarch
  ON invent.shipment_id = inboundarch.shipment_id

字符串
这不需要CTE或内联视图或UNION
因为只有两个值,所以也可以使用NVL,但COALESCE更标准。

5cnsuln7

5cnsuln73#

假设你有两张table:一个用于常规入站发运('inbound_shipments'),另一个用于存档入站发运('inbound_shipments_archive')。您还有一个'inventory'表。
您希望了解库存中的每项物料的来源,是来自常规发运还是存档发运。如果发运不在常规表中,则可能在存档表中。
以下是您的操作方法:
对于库存中的每个项目,您都可以检查常规发运和存档发运。如果项目在常规发运中,那太好了!如果不是,您可以检查存档发运。如果项目在存档发运中,那就是它的来源。
在SQL中,查询看起来像这样:

SELECT
    invent.item_id,
    invent.location_id,
    invent.quantity,
    COALESCE(inbound.origin, inboundarch.origin) AS origin
FROM
    inventory invent
LEFT JOIN
    inbound_shipments inbound ON invent.shipment_id = inbound.shipment_id
LEFT JOIN
    inbound_shipments_archive inboundarch ON invent.shipment_id = inboundarch.shipment_id;

字符串
COALESCE功能可帮助您从常规货件或存档货件中选择原产地,具体取决于信息的可用位置。

相关问题