Sql 复外连接条件

Sql 复外连接条件,sql,sql-server,Sql,Sql Server,我有下面的桌子结构 逻辑:如果是工厂零件号组合,如果在@MHL表格中有条目,则应将SumQty LISE 我需要列出工厂“11”和“DEF”零件号组合的总和,我需要列出50的总和 代码 DECLARE @MHL TABLE (LineNumber VarCHAR(5), PartNumber VARCHAR(10), Qty INT) INSERT INTO @MHL VALUES ('10001','ABC',10) INSERT INTO @MHL VALUES ('10002','AB

我有下面的桌子结构

逻辑:如果是工厂零件号组合,如果在@MHL表格中有条目,则应将SumQty LISE

  • 我需要列出工厂“11”和“DEF”零件号组合的总和,我需要列出50的总和
  • 代码

    DECLARE @MHL TABLE (LineNumber VarCHAR(5), PartNumber VARCHAR(10), Qty INT)
    
    
    INSERT INTO @MHL VALUES ('10001','ABC',10)
    INSERT INTO @MHL VALUES ('10002','ABC',100)
    INSERT INTO @MHL VALUES ('10003','DEF',50)
    INSERT INTO @MHL VALUES ('10005','KXY',25)
    INSERT INTO @MHL VALUES ('10006','KXY',30)
    
    
    DECLARE @MHP TABLE (PlantCode VarCHAR(5), LineNumber VARCHAR(5))
    INSERT INTO @MHP VALUES ('20','10001')
    INSERT INTO @MHP VALUES ('21','10002')
    INSERT INTO @MHP VALUES ('80','10005')
    INSERT INTO @MHP VALUES ('80','10006')
    
    
    DECLARE @MasterPLantParts TABLE (PlantCode VarCHAR(5), PartNumber VARCHAR(10))
    
    INSERT INTO @MasterPLantParts VALUES ('20','ABC')
    INSERT INTO @MasterPLantParts VALUES ('21','ABC')
    INSERT INTO @MasterPLantParts VALUES ('96','ABC')
    INSERT INTO @MasterPLantParts VALUES ('11','DEF')
    INSERT INTO @MasterPLantParts VALUES ('80','KXY')
    
    
    SELECT M.PlantCode,M.PartNumber,SumQty
    FROM @MasterPLantParts M
    LEFT OUTER JOIN 
        (SELECT PartNumber, PlantCode, SUM(Qty) SumQty
         FROM @MHL H
         LEFT OUTER JOIN @MHP p
            on P.LineNumber = H.LineNumber
         GROUP BY PartNumber, PlantCode
        )T
    ON T.PartNumber = M.PartNumber
    AND T.PlantCode = M.PlantCode
    
    当前结果

    预期结果

    问题

    QtySum“50”现在不来了。如何在SQLServer2005中实现这一点?如果该方法也能在Oracle 8i中工作,那就太好了


    注意:即使@MHP中没有记录,我也需要从@MHL中获取总和。但是如果@MHP中有值,请从@MHP、@MHL relationship中获取相关值,我还没有在您的任何dbms上对其进行测试,但应该可以在这两个dbms上进行小的修复

    select PlantCode, PartNumber, sum(qty) 
    from (
        select x.PlantCode, x.PartNumber, y.Qty 
        from MasterPLantParts x 
        join MHL y 
            on x.PartNumber = y.PartNumber 
        left join MHP z 
            on x.PlantCode = z.PlantCode 
        where z.PlantCode is null 
        union 
        select x.PlantCode, x.PartNumber, z.Qty 
        from MasterPLantParts x 
        join MHP y 
            on x.PlantCode = y.PlantCode 
        join mhl z 
            on y.LineNumber = z.LineNumber
    ) as T 
    group by PlantCode, PartNumber;
    
    PLANTCODE PARTNUMBER 3          
    --------- ---------- -----------
    11        DEF                 50
    20        ABC                 10
    21        ABC                100
    80        KXY                 55
    96        ABC                110
    
    如果MHP中没有这些值,您将始终具有空值,因为左外部联接就是这样做的

    编辑

    select 
      mpp.PlantCode PlantCode, 
      mpp.PartNumber PartNumber,
      sum(MHL.Qty) as SumQty
    from MasterPLantParts mpp, MHP, MHL 
    where mpp.PlantCode = MHP.PlantCode(+)
    and (MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null))
    group by mpp.PlantCode, mpp.PartNumber
    order by mpp.PlantCode, mpp.PartNumber;
    
    下面的查询(比我发布的第一个查询更简单)将得到所需的结果。首先,选择MasterPLantParts中的所有行(使用左侧外部联接)。然后,使用MHL进行连接。如果给定电厂的MHP中没有条目,则将为电厂选择MHL的所有线路)

    Oracle 8i语法

    select 
      mpp.PlantCode PlantCode, 
      mpp.PartNumber PartNumber,
      sum(MHL.Qty) as SumQty
    from MasterPLantParts mpp, MHP, MHL 
    where mpp.PlantCode = MHP.PlantCode(+)
    and (MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null))
    group by mpp.PlantCode, mpp.PartNumber
    order by mpp.PlantCode, mpp.PartNumber;
    
    参考

    select 
      mpp.PlantCode PlantCode, 
      mpp.PartNumber PartNumber,
      sum(MHL.Qty) as SumQty
    from MasterPLantParts mpp, MHP, MHL 
    where mpp.PlantCode = MHP.PlantCode(+)
    and (MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null))
    group by mpp.PlantCode, mpp.PartNumber
    order by mpp.PlantCode, mpp.PartNumber;
    

    你能解释一下逻辑吗?为什么“11”和“DEF”的值是50,而“96”和“ABC”的值是0?如果执行以下语句,DEF的值将出现:
    INSERT INTO@MHP VALUES('11','10003')
    @cha是对的,PlantCode和LineNumber之间没有关系,因此SQL无法通过任何连接获取零件/数量,除非您从数量开始计算,否则PlantCode将为空。您能否帮助Oracel 8i查询,以便我将其标记为答案?您是否收到有关Oracel 8i的错误消息?我没有可用的,但这似乎是基本的SQL,应该可以使用。@Lijo请检查上面更新的答案,了解Oracle 8i语法。