晚上好!
我遇到了一个很难理解的奇怪问题。
我有3个表(零件表,零件移动历史记录和零件明细表)。
我要做的是让结果集返回批号,零件号,产品描述,数量,零件位置,库存中的当前物料(相对于完整历史记录)以及上次移动产品的人员。
现在,进行查询。当我运行下面的查询时,我得到了4,751行的结果集;完全符合我的预期结果。但是,当我尝试在userid字段中添加时,我得到的结果集为186,573。这个庞大的结果集似乎可以提取所有历史数据,而不仅仅是将用户ID与我实际需要的4,751行进行匹配。
从零件表中我需要(prod_desc) 在我需要的零件明细表中(批次,零件号,批次数量,位置) 我需要从“零件移动历史记录”表中(move_date,user_id)
4,751查询:
SELECT DISTINCT
inv.lot,
inv.part#,
prt.prod_desc,
inv.lotquantity,
inv.prtlocation,
MAX(mv.move_date)AS 'Move Date'
FROM invdet AS inv
LEFT JOIN movetable AS mv ON inv.part# = mv.part#
LEFT JOIN partmstr AS prt ON inv.part# = prt.part#
WHERE inv.lot IS NOT NULL
GROUP BY inv.lot,inv.part#,prt.prod_desc,inv.lotquantity,inv.prtlocation
ORDER BY inv.prtlocation
186,573查询:
SELECT DISTINCT
inv.lot,
inv.part#,
prt.prod_desc,
inv.lotquantity,
inv.prtlocation,
MAX(mv.move_date)AS 'Move Date'
mv.user_id
FROM invdet AS inv
LEFT JOIN movetable AS mv ON inv.part# = mv.part#
LEFT JOIN partmstr AS prt ON inv.part# = prt.part#
WHERE inv.lot IS NOT NULL
GROUP BY inv.lot,inv.part#,prt.prod_desc,inv.lotquantity,inv.prtlocation,mv.user_id
ORDER BY inv.prtlocation
如果我不使用MAX函数,则不会获得当前清单,而是会获得表中不需要的所有结果。我仍在学习,而我的GROUP BY仍然有很多不足之处,因为我仍在努力解决问题(欢迎提出建议!)。我敢肯定有一个子查询可以放在这里的某个地方,但是我仍然在弄清楚那些子查询。任何帮助将不胜感激!
答案 0 :(得分:0)
我认为问题在于,当您从表movetable中插入mv.user_id时,您会得到所有零件的运动,而不仅仅是最后一个日期为max(mv.move_date)的运动。 一种方法是将左联接删除到可移动表,然后使用交叉应用
uint
我还没有测试它,但是应该没问题,也许有点慢,因为交叉应用在inv表的每一行执行一个子查询。如果速度太慢,则可以使用ROWNUMBER创建仅由最后一个动作组成的表,然后在LEFT JOIN中使用它,如下所示:
SELECT inv.lot,inv.part,prt.prod_desc,inv.lotquantity,inv.prtlocation,x.move_date,x.user_id
FROM invdet AS inv
CROSS APPLY(SELECT TOP 1
mv.user_id,mv.move_date
FROM movetable mv
WHERE inv.part=mv.part
ORDER BY mv.move_date DESC) AS x
LEFT JOIN partmstr AS prt ON inv.part=prt.part
WHERE inv.lot IS NOT NULL
ORDER BY inv.prtlocation
希望有帮助。