如何使用LEFT JOIN和OR子句联接两个以上的表?

时间:2018-07-09 19:20:12

标签: sql left-join

我无法连接多个表。我有一个查询仅在所有表中都包含数据时才有效。但是,相反,我需要执行left join来显示空行。我确实有另一个使用left join的查询,但无法正常工作。
最后,这也是我们数据库设计方式的问题,我将在下面解释。

首先,我有下表:

  • 客户:订单运送到的位置以及客户订购的商品。当客户向我们公司创建订单时,将在客户表中添加一行。
  • 产品:我们要发货的数量和数量。该信息也可以在“客户”表中找到,但是唯一的区别是“产品”表包含称为“纸箱ID”的内容。纸箱ID是一个唯一的编号,使我们能够查看从仓库中哪个货架位置拣选了每种产品的数量。此外,该表还包含另一个编号,称为“分拣ID”(系统生成的唯一编号)。
  • 主ID(这是我所指的问题):有两种不同类型的主ID。当我们仅订购一种产品时,纸箱ID将用作“主ID”表中的“主ID”。还有一个名为“子代ID”的列,其中将包含“产品”表中的“选择ID”。
    如果我们有一个订单中有两个或两个以上产品(并且这些产品需要装在一个盒子中一起装运),则不同的纸箱ID将合并到一个新的主ID中。在这种情况下,“主ID”表中的“子ID”将与“产品”表中的“纸箱ID”相同,因此系统将如何知道这些ID已被合并。希望这部分有意义。
  • 清单:完成订单并准备从仓库发货后,将在此表中填充所有相关的运输数据(重量和重量,跟踪ID等)。由于我们使用两个不同的系统(仓库管理系统和运输系统),因此使用主ID来允许这两个系统之间的数据传输。这意味着一个订单可以具有例如五个纸箱ID。根据要合并的纸箱ID,您可以拥有一个或多个Master ID。每个Master ID都有其自己的重量,昏暗度和跟踪号。

我的查询仅在所有表中都有数据时才起作用,这是由于使用了where子句:

select c.company, 
    p.SKU, 
    p.carton_id, 
    mi.master_id, 
    m.length, 
    m.width, 
    m.height, 
    m.weight, 
    m.trackingid 
from customer c, 
    products p, 
    master_ids mi, 
    manifest m
where c.ordernumber = p.ordernumber
    and c.ordernumber = m.ordernumber
    and (p.carton_id = mi.child_id or p.pick_id = mi.child_id) 
    and mi.master_id = m.master_id
    and c.ordernumber = 4558689658;

我使用left join重写了此查询。这是我到目前为止所拥有的,但是并不能按照我想要的方式工作:

select c.company, 
    p.SKU, 
    p.carton_id, 
    mi.master_id, 
    m.length, 
    m.width, 
    m.height, 
    m.weight, 
    m.trackingid 
from customer c
    left join products p
        on c.ordernumber = p.ordernumber
    left join master_ids mi
        on p.carton_id = mi.child_id or p.pick_id = mi.child_id
    left join manifest m
        on mi.master_id = m.master_id
    left join manifest m
        on c.ordernumber = m.ordernumber
where c.ordernumber = 4558689658;

无论订单状态如何,left join查询都需要向我显示数据。每个过程(拣配,包装,运输等)都会向上面的表中添加新数据,无论订单状态如何,我都希望看到它。
那么,如何重写第二个查询?我更喜欢先尝试一下。因此,请不要告诉我正确的查询,请告诉我我做错了什么以及纠正它需要做些什么。

1 个答案:

答案 0 :(得分:0)

我不完全理解您的问题(不好),但我想向您提供建议。随意忽略它。我看到两件事:

  • 无论其他表是否具有相关行,如果要包括产品,都需要从<div class="col-sm-6"> <div class="well well-sm" style="background-color:lightcyan"> <h4>AVAS for Opperations</h4> <div class="list-group"> <a href="https://go.microsoft.com/fwlink/?LinkID=398939" class="list-group-item" data-toggle="tooltip" title="(Make charts of buses passing timepoints!)">AVAS Time-Space Chart <img src="https://cdn1.iconfinder.com/data/icons/education-set-4/512/information-512.png" class="w3-round" alt="Denmark" style="width:3%"></a> <a href="https://go.microsoft.com/fwlink/?LinkID=398939" class="list-group-item" data-toggle="tooltip" title="(Make a list of Route and Logon events from a bus, run or O/B)">History by Bus/Run/Operator <img src="https://cdn1.iconfinder.com/data/icons/education-set-4/512/information-512.png" class="w3-round" alt="Denmark" style="width:3%"></a> <a asp-area="" asp-controller="Home" asp-action="Legal" class="list-group-item" data-toggle="tooltip" title="(Make a list of stops and timepoints for a bus for an hour)">Bus-Hour History <img src="https://cdn1.iconfinder.com/data/icons/education-set-4/512/information-512.png" class="w3-round" alt="Denmark" style="width:3%"></a> <a asp-area="" asp-controller="Home" asp-action="Legal" class="list-group-item" data-toggle="tooltip" title="(Make a list of buses passing a selected stop)">Bus-Stop History <img src="https://cdn1.iconfinder.com/data/icons/education-set-4/512/information-512.png" class="w3-round" alt="Denmark" style="width:3%"></a> </div> </div> </div> 表开始。然后,您使用products联接其他表。
  • 所有相关表的过滤条件都必须放在LEFT JOIN的{​​{1}}子句中,而不是ON子句中。后者只能用于过滤主表上的条件。
select c.company, 
    p.SKU, 
    p.carton_id, 
    mi.master_id, 
    m.length, 
    m.width, 
    m.height, 
    m.weight, 
    m.trackingid 
from products p -- Start with the table you want to always include
    left join customer c
        on c.ordernumber = p.ordernumber 
       and c.ordernumber = 4558689658 -- filter a related table here
    left join master_ids mi
        on p.carton_id = mi.child_id or p.pick_id = mi.child_id
    left join manifest m
        on mi.master_id = m.master_id
    left join manifest m
        on c.ordernumber = m.ordernumber;