我正在SSMS的查询窗口中工作。
使用3张桌子:
我的目标是报告工序的状态(例如#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')
答案 0 :(得分:0)
您没有给出足够的信息来确定答案,所以我将为您提供一种调试方法。
由于JOIN,您得到了意外的行。这意味着您的JOIN条件不是一对一地匹配JOIN的两侧。表中有多个要联接的行符合JOIN条件。
要查找这些行,请将SELECT列表临时更改为SELECT *
。在外部SELECT和派生表中都执行此操作。仔细查看JOINed表返回的列,并找到您不希望返回的值。
由于导致问题的JOIN是最后一个问题,因此它们一直到SELECT *
结果的右边。
然后向JOIN添加更多条件,以消除结果中不需要的行。
答案 1 :(得分:0)
我通过首先创建一个由先前嵌套的SELECT填充的临时表,然后从父SELECT联接到它来简化了整个查询。
现在完美运行。感谢您的关注。
PS:对于错误消息的困惑,我深表歉意。发布后,我注意到代码中有关于错误的旧注释。错误已在发布前得到解决,但我忽略了删除评论。