SQL:选择DISTINCT不返回DISTINCT值
下面的代码应该从子查询返回lp_num字段中的唯一记录,然后用于外部查询,但我仍然得到lp_num字段的倍数。一个ReferenceNumber可以有多个ApptDate记录,但每个lp_num只能有一个rf_num。这就是为什么我一直试图在子查询中检索唯一的lp_num记录,但它不起作用。我正在使用报表生成器3.0 电流输出 期望的输出是在lp_num字段中只有唯一的记录。这是因为lp_num字段中的每个值都是一个工作台,一个工作台。右边的信息是它到达的时间(ApptDate)和交付的参考号(ref_num)。因此,托盘有多个接收日期是没有意义的…它只能到达一次SQL:选择DISTINCT不返回DISTINCT值,sql,sql-server,distinct,reportbuilder3.0,Sql,Sql Server,Distinct,Reportbuilder3.0,下面的代码应该从子查询返回lp_num字段中的唯一记录,然后用于外部查询,但我仍然得到lp_num字段的倍数。一个ReferenceNumber可以有多个ApptDate记录,但每个lp_num只能有一个rf_num。这就是为什么我一直试图在子查询中检索唯一的lp_num记录,但它不起作用。我正在使用报表生成器3.0 电流输出 期望的输出是在lp_num字段中只有唯一的记录。这是因为lp_num字段中的每个值都是一个工作台,一个工作台。右边的信息是它到达的时间(ApptDate)和交付的参考号
SELECT DISTINCT
dbo.ISW_LPTrans.item,
dbo.ISW_LPTrans.lot,
dbo.ISW_LPTrans.trans_type,
dbo.ISW_LPTrans.lp_num,
dbo.ISW_LPTrans.ref_num,
(MIN(CONVERT(VARCHAR(10),dbo.CW_CheckInOut.ApptDate,101))) as appt_date_only,
dbo.CW_CheckInOut.ApptTime,
dbo.item.description,
dbo.item.u_m,
dbo.ISW_LPTrans.qty,
(CASE
WHEN dbo.ISW_LPTrans.trans_type = 'F'
THEN 'Produced internally'
ELSE
(CASE
WHEN dbo.ISW_LPTrans.trans_type = 'R'
THEN 'Received from outside'
END)
END
) as original_source
FROM
dbo.ISW_LPTrans
INNER JOIN dbo.CW_Dock_Schedule ON LTRIM(RTRIM(dbo.ISW_LPTrans.ref_num)) = dbo.CW_Dock_Schedule.ReferenceNumber
INNER JOIN dbo.CW_CheckInOut ON dbo.CW_CheckInOut.TruckID = dbo.CW_Dock_Schedule.TruckID
INNER JOIN dbo.item ON dbo.item.item = dbo.ISW_LPTrans.item
WHERE
(dbo.ISW_LPTrans.trans_type = 'R') AND
--CONVERT(VARCHAR(10),dbo.CW_CheckInOut.ApptDate,101) <= CONVERT(VARCHAR(10),dbo.ISW_LPTrans.trans_date,101) AND
dbo.ISW_LPTrans.lp_num IN
(SELECT DISTINCT
dbo.ISW_LPTrans.lp_num
FROM
dbo.ISW_LPTrans
INNER JOIN dbo.item ON dbo.ISW_LPTrans.item = dbo.item.item
INNER JOIN dbo.job ON dbo.ISW_LPTrans.ref_num = dbo.job.job AND dbo.ISW_LPTrans.ref_line_suf = dbo.job.suffix
WHERE
(dbo.ISW_LPTrans.trans_type = 'W' OR dbo.ISW_LPTrans.trans_type = 'I') AND
dbo.ISW_LPTrans.ref_num IN
(SELECT
dbo.ISW_LPTrans.ref_num
FROM
dbo.ISW_LPTrans
--INNER JOIN dbo.ISW_LPTrans on dbo.ISW_LPTrans.
WHERE
dbo.ISW_LPTrans.item LIKE @item AND
dbo.ISW_LPTrans.lot LIKE @lot AND
dbo.ISW_LPTrans.trans_type = 'F'
GROUP BY
dbo.ISW_LPTrans.ref_num
) AND
dbo.ISW_LPTrans.ref_line_suf IN
(SELECT
dbo.ISW_LPTrans.ref_line_suf
FROM
dbo.ISW_LPTrans
--INNER JOIN dbo.ISW_LPTrans on dbo.ISW_LPTrans.
WHERE
dbo.ISW_LPTrans.item LIKE @item AND
dbo.ISW_LPTrans.lot LIKE @lot AND
dbo.ISW_LPTrans.trans_type = 'F'
GROUP BY
dbo.ISW_LPTrans.ref_line_suf
)
GROUP BY
dbo.ISW_LPTrans.lp_num
HAVING
SUM(dbo.ISW_LPTrans.qty) < 0
)
GROUP BY
dbo.ISW_LPTrans.item,
dbo.ISW_LPTrans.lot,
dbo.ISW_LPTrans.trans_type,
dbo.ISW_LPTrans.lp_num,
dbo.ISW_LPTrans.ref_num,
dbo.CW_CheckInOut.ApptDate,
dbo.CW_CheckInOut.ApptTime,
dbo.item.description,
dbo.item.u_m,
dbo.ISW_LPTrans.qty
ORDER BY
dbo.ISW_LPTrans.lp_num
选择DISTINCT
dbo.ISW_LPTrans.item,
dbo.ISW_LPTrans.lot,
dbo.ISW_LPTrans.trans_类型,
dbo.ISW_LPTrans.lp_num,
dbo.ISW_LPTrans.ref_num,
(最小值(转换为(VARCHAR(10),dbo.CW\u CheckInOut.ApptDate,101)))仅作为appt\u日期,
dbo.CW_CheckInOut.ApptTime,
dbo.item.description,
dbo.item.um,
dbo.ISW\U LPTrans.qty,
(案例
当dbo.ISW_LPTrans.trans_type='F'
然后“内部生产”
其他的
(案例
当dbo.ISW_LPTrans.trans_type='R'
然后“从外部接收”
(完)
结束
)作为原始来源
从…起
dbo.ISW_LPTrans
LTRIM上的内部联接dbo.CW_Dock_调度(RTRIM(dbo.ISW_LPTrans.ref_num))=dbo.CW_Dock_调度。参考编号
dbo.CW\u CheckInOut.TruckID=dbo.CW\u Dock\u Schedule.TruckID上的内部联接dbo.CW\u CheckInOut
dbo.item.item=dbo.ISW\u LPTrans.item上的内部联接dbo.item
哪里
(dbo.ISW_LPTrans.trans_type='R')和
--CONVERT(VARCHAR(10),dbo.CW_CheckInOut.ApptDate,101)简而言之,从SQL的角度来看,使用DISTINCT
的方式在逻辑上是错误的
您的DISTINCT
位于WHERE
子句中的in
子查询中,并且在代码的这一点上,它绝对没有影响(性能惩罚除外)。仔细想想-如果外部查询返回的非唯一值dbo.ISW_LPTrans.lp_num
(很明显发生了这种情况),那么这些值仍然可以在子查询中的不同值范围内-在中不强制执行1对1匹配,它只强制执行外部查询值在内部值范围内的事实,但它们可以匹配多次。所以这绝对不是
明显的
的错
我将执行以下检查步骤:
- 查看导致数据乘法的外部
FROM
部分中的连接条件是否不足(例如,如果一个表在多个列上具有主键到外键的关系,但您仅在其中一列上连接,等等)
- 在外部
FROM
部分中检查哪些源包含非不同记录,然后清除源,或者调整连接条件和/或WHERE子句,以便只选择不同且正确的记录。事实上,您可能需要在FROM
部分的中选择DISTINCT
,这样会更有意义
仅仅因为内部子查询包含唯一的结果,并不意味着外部查询将受到类似的限制。在外部查询中也必须使用DISTINCT
(或GROUP BY
)。例如,如果内部查询返回(1,2,3
),则外部查询仍然可以包含(1,1,2,2,3,3,3,3,3
),这没关系,因为每个外部查询值都在内部查询值中。在外部查询中使用GROUP BY
会迫使我将所有外部字段都放在该子句中(否则会产生错误),因此,取消返回唯一lp_num值的功能,因为对于每个lp_num->ref_num->apt_date_,对于每1个lp_num(对于某些记录),只有3个apt_date_。在外部查询中使用DISTINCT
会给我一个错误:单词DISTINCT
附近的语法不正确。这发生在我直接在dbo.ISW_LPTrans.lp_num的左边添加了DISTINCT
时(当然带有空格)显示您正在获得的输出,并显示您期望的输出,我们可以提供帮助。明白了。dbo.ISW\u LPTrans有一个字段Uf\u TruckID,我需要它在dbo.CW\u Dock\u Schedule.TruckID(该表的primray键…)上内部连接