情况是这样的。我有一个库存表(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
型
谢谢你的时间
3条答案
按热度按时间6qqygrtg1#
一个“干净”的方法来做到这一点将
UNION
inbound_shipments
和inbound_shipments_archive
在a CTE和JOIN
到:字符串
上面的示例假设
inbound_shipments
和inbound_shipments_archive
具有相同的模式-如果它们不具有相同的模式,仍然可以对它们进行UNION
,但是您必须非常谨慎地从CTE中的每个组件表中选择字段。hrysbysz2#
您可以使用
COALESCE
从主发货表(如果有)返回值,或者从存档表(如果没有)返回值:COALESCE
返回表达式列表中的第一个非空 expr。您必须至少指定两个表达式。如果所有出现的 expr 计算为null,则函数返回null。因此,与其在选择列表中同时包含两个表中的列,不如将它们替换为
COALESCE
的结果,并(可选地)给予该列表达式一个别名:字符串
这不需要CTE或内联视图或
UNION
。因为只有两个值,所以也可以使用
NVL
,但COALESCE
更标准。5cnsuln73#
假设你有两张table:一个用于常规入站发运('inbound_shipments'),另一个用于存档入站发运('inbound_shipments_archive')。您还有一个'inventory'表。
您希望了解库存中的每项物料的来源,是来自常规发运还是存档发运。如果发运不在常规表中,则可能在存档表中。
以下是您的操作方法:
对于库存中的每个项目,您都可以检查常规发运和存档发运。如果项目在常规发运中,那太好了!如果不是,您可以检查存档发运。如果项目在存档发运中,那就是它的来源。
在SQL中,查询看起来像这样:
字符串
COALESCE功能可帮助您从常规货件或存档货件中选择原产地,具体取决于信息的可用位置。