SQL:使用一个表作为自身的标准

时间:2016-06-27 16:06:43

标签: sql subquery criteria

我正在尝试使用表的参数作为自身的标准,并且不能完全正确地获取我的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

2 个答案:

答案 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

但请注意,有一种更容易(恕我直言)的方式。由于您无论如何都按JobNumOprSeq进行分组,因此您只需计算活动事务的数量,并使用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