SQL SRVR 2016:无法连接到嵌套的select语句

时间:2019-02-26 20:56:47

标签: sql sql-server tsql left-join outer-join

我正在SSMS的查询窗口中工作。

使用3张桌子:

  • WORK_ORDER wo
    • 制造零件的订单
  • OPERATION op
    • 零件制造中的操作(激光,研磨,电镀等)
  • PART pt
    • 定义零件的唯一记录

我的目标是报告工序的状态(例如#3)(订购的总零件数,已完成的零件数),但还要在报告中包括完成上一工序(#2)的零件数。顺序并准备好进行该过程。我的解决方案是使用LAG函数,当以下嵌套的select语句独立运行时,该函数可以完美运行,但结果中出现4倍重复平均值,并且不会显示Completed_QTY_PREV_OP列。我知道这是因为它不在父select语句中,但是我想先更正联接。我猜这两个问题有关。

脚注:WHERE包含一个可以忽略的过滤器。父选择语句在没有联接子查询的情况下可以完美地工作。

这是我的SQL:

SELECT  op.RESOURCE_ID, pt.USER_5 AS PRODUCT, wo.PART_ID, wo.TYPE, wo.BASE_ID, 
        wo.LOT_ID, wo.SPLIT_ID, wo.SUB_ID, op.SEQUENCE_NO, pt.DESCRIPTION, 
        wo.DESIRED_QTY, op.FULFILLED_QTY AS QTY_COMP, op.SERVICE_ID, op.DISPATCHED_QTY, wo.STATUS

FROM dbo.WORK_ORDER wo INNER JOIN
        dbo.OPERATION op ON wo.TYPE = op.WORKORDER_TYPE
        AND wo.BASE_ID = op.WORKORDER_BASE_ID 
        AND wo.LOT_ID = op.WORKORDER_LOT_ID
        AND wo.SPLIT_ID = op.WORKORDER_SPLIT_ID 
        AND wo.SUB_ID = op.WORKORDER_SUB_ID INNER JOIN
            dbo.PART pt ON wo.PART_ID = pt.ID

        LEFT OUTER JOIN 
            --The nested select statement works by itself in a query window,
            --but the JOIN throws an error.
            (SELECT 
                pr.WORKORDER_TYPE, pr.WORKORDER_BASE_ID, pr.WORKORDER_LOT_ID, 
                pr.WORKORDER_SPLIT_ID, pr.WORKORDER_SUB_ID, pr.SEQUENCE_NO,
                LAG (COMPLETED_QTY, 1) OVER (ORDER BY pr.WORKORDER_TYPE, pr.WORKORDER_BASE_ID, 
                pr.WORKORDER_LOT_ID, pr.WORKORDER_SPLIT_ID, pr.WORKORDER_SUB_ID, pr.SEQUENCE_NO) AS COMP_QTY_PREV_OP
            FROM dbo.OPERATION AS pr) AS prev
            --End of nested select 

            ON
                op.WORKORDER_TYPE = prev.WORKORDER_TYPE AND
                op.WORKORDER_BASE_ID = prev.WORKORDER_BASE_ID AND
                op.WORKORDER_LOT_ID = prev.WORKORDER_LOT_ID AND
                op.WORKORDER_SPLIT_ID = prev.WORKORDER_SPLIT_ID AND
                op.WORKORDER_SUB_ID = prev.WORKORDER_SUB_ID

WHERE (NOT (op.SERVICE_ID IS NULL)) AND (wo.STATUS = N'R')

2 个答案:

答案 0 :(得分:0)

您没有给出足够的信息来确定答案,所以我将为您提供一种调试方法。

由于JOIN,您得到了意外的行。这意味着您的JOIN条件不是一对一地匹配JOIN的两侧。表中有多个要联接的行符合JOIN条件。

要查找这些行,请将SELECT列表临时更改为SELECT *。在外部SELECT和派生表中都执行此操作。仔细查看JOINed表返回的列,并找到您不希望返回的值。

由于导致问题的JOIN是最后一个问题,因此它们一直到SELECT *结果的右边。

然后向JOIN添加更多条件,以消除结果中不需要的行。

答案 1 :(得分:0)

我通过首先创建一个由先前嵌套的SELECT填充的临时表,然后从父SELECT联接到它来简化了整个查询。

现在完美运行。感谢您的关注。

PS:对于错误消息的困惑,我深表歉意。发布后,我注意到代码中有关于错误的旧注释。错误已在发布前得到解决,但我忽略了删除评论。