我正在尝试使用表的参数作为自身的标准,并且不能完全正确地获取我的sql语句。这似乎是一个相对简单的查询;我正在使用子查询作为我的条件,但它没有过滤掉我桌子上的其他行。
背景
制造生产车间:我的机器上有一群机械师正在运行一项工作(JobNum)的操作(OprSeq)。在LaborDtl表中,它记录了所有劳动力活动,我可以看到当前活动的劳动力(ActiveTrans = 1)。有了这个积极劳动的标准,我想总结每个活跃劳动力入口的所有过去的劳动力交易。因此,我需要一个非活动劳动力活动的LaborDtl表,其中包含来自同一个表的活跃劳动标准。
代码:
继承我的'标准'子查询:
SELECT
LaborDtl.JobNum,
LaborDtl.OprSeq
FROM Erp.LaborDtl
WHERE LaborDtl.ActiveTrans = 1
返回活动交易,这是第一对(按作业排序):
Job Operation
000193 90
000457 70
000457 70
020008-1 140
020008-2 130
020010 60
020035 130
020175 40
020175-2 50
020186 80
020199 10
020203 50
020212 40
020258 60
020272 10
020283 30
020298 10
020299 30
然后这是完整的SQL语句,嵌入了上面的查询:
SELECT
LaborDtl.JobNum,
LaborDtl.OprSeq as "Op",
SUM(LaborDtl.LaborQty) as "Total Labor"
FROM Erp.LaborDtl
WHERE EXISTS
(
SELECT
LaborDtl.Company,
LaborDtl.JobNum,
LaborDtl.OprSeq
FROM Erp.LaborDtl
WHERE LaborDtl.ActiveTrans = 1 --Labor table of just current activity
)
GROUP BY LaborDtl.JobNum, LaborDtl.OprSeq
我希望只查看子查询中存在的作业和操作号,但我得到的子查询中不存在的作业和操作。这是前10个(注意,第一个JobNum应该是我的标准000193)
JobNum Op Total Labor
0 0.00000000
000004 1 32.00000000
000019 1 106.00000000
000029 1 175.00000000
000143 1 85.00000000
000164 1 58.00000000
000181 1 500.00000000
000227 1 116.00000000
000421 1 154.00000000
000458 1 67.00000000
答案 0 :(得分:0)
在不知道RDBMS供应商和版本的情况下,这是我能做的最好的事情:
SELECT
t1.JobNum,
t1.OprSeq as "Op",
SUM(t1.LaborQty) as "Total Labor"
FROM Erp.LaborDtl t1
WHERE EXISTS
(
SELECT 1
FROM Erp.LaborDtl t2
WHERE t2.ActiveTrans = 1 --Labor table of just current activity
and t2.Company = t1.Company
and t2.JobNum = t1.JobNum
and t2.OprSeq = t1.OprSeq
)
GROUP BY t1.JobNum, t1.OprSeq
答案 1 :(得分:0)
你错过了将外部和内部查询联系在一起的一些条件。现在,没有该条件,内部查询只返回“true”,因为存在具有活动活动的作业,因此返回外部查询中的所有行。请注意,您必须向表中添加别名,因为内部和外部查询使用相同的表:
SELECT a.JobNum, a.OprSeq as "Op", SUM(a.LaborQty) as "Total Labor"
FROM Erp.LaborDtl a
WHERE EXISTS (SELECT * -- The select list doesn't really matter here
FROM Erp.LaborDtl b
WHERE a.JobNum = b.JobNum AND -- Here!
a.OprSeq = b.OprSeq AND -- And here!
b.ActiveTrans = 1 -- Labor table of just current activity
)
GROUP BY a.JobNum, a.OprSeq
但请注意,有一种更容易(恕我直言)的方式。由于您无论如何都按JobNum
和OprSeq
进行分组,因此您只需计算活动事务的数量,并使用having
子句仅查询至少有一个活动事务的事务: / p>
SELECT JobNum, OprSeq as "Op", SUM(LaborQty) as "Total Labor"
FROM Erp.LaborDtl
GROUP BY JobNum, OprSeq
HAVING COUNT(CASE ActiveTrans WHEN 1 THEN 1 END) > 0