Sql 复外连接条件
我有下面的桌子结构 逻辑:如果是工厂零件号组合,如果在@MHL表格中有条目,则应将SumQty LISESql 复外连接条件,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
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语法。