【发布时间】:2017-08-11 19:37:49
【问题描述】:
SELECT
worksorders.id AS 'Works Order No',
worksorders.partid AS 'Part No',
allpartmaster.partdesc AS 'Description',
worksorders.quantity AS 'Qty',
wip.wqleft AS 'Qty Rem',
worksorders.duedate AS 'Due Date',
worksorders.lateststartdate AS 'Latest Start Date',
worksorders.kitstatus AS 'Kit Status',
wip.wopnumber AS 'Op No',
wip.wmachine AS 'Work Centre',
wip.wdesc AS 'WC Description',
wip.wstate as 'Op State',
(SELECT wstate FROM wip WHERE wip.wona = worksorders.id and wip.wopnumber = (wip.wopnumber - 10)) as 'Prev Op State'
FROM efacdb.dbo.allpartmaster allpartmaster, efacdb.dbo.wip wip, efacdb.dbo.worksorders worksorders
WHERE worksorders.id = wip.wona AND allpartmaster.partnum = worksorders.partid AND ((worksorders.status = 'ACTIVE') AND (wip.wstate = 'NS'))
AND wip.wmachine = 'POLISH'
ORDER BY worksorders.lateststartdate ASC
我在处理这个查询时遇到了问题,我不确定它是否可行。我正在返回以 10 为步数的操作,我需要返回上一个操作的状态。这是关键行:
(SELECT wstate FROM wip WHERE wip.wona = worksorders.id and wip.wopnumber = (wip.wopnumber - 10)) as 'Prev Op State'
我想从父 SELECT 查询中获取 wopnumber,将其减去 10 并返回该行的 wstate 列。
这可能吗?
【问题讨论】:
-
我认为样本数据和期望的结果确实有助于解释您想要做什么。
-
您应该在子查询中使用不同的别名,以便您可以引用外部表。您还应该使用 ANSI 连接 - 自 1992 年以来,它们就一直在 SQL 标准中,也就是 25 年前 年前。
-
@Damien_The_Unbeliever Old school 加入显然有一定的怀旧之情,有点像听经典摇滚:-)
-
这很容易实现,但正如其他人所说,向您展示该代码确实是一个大便。更新您的代码以使用 ANSI 联接,并将该选择放入子查询中,或者使用 CTE,您将能够做到。
-
感谢大家的帮助,我可以据此解决问题
标签: sql sql-server tsql