查询无法正常工作,可能出现语法错误?

时间:2019-05-03 13:33:05

标签: sql oracle

我正在尝试查看系统中所有在这些工单上具有三个特定服务代码的工单。该查询确实执行了该操作,但是该查询显示了具有这三个特定服务代码的那些工单,但仅显示了这三个特定服务代码。有时工作单上还有其他服务代码以及我想看到的三个。在这些情况下,我需要查看工作订单上的这三个以及其他项目。但是我不想看到没有这三个服务代码的工作单。

有时,工作订单上还有许多其他服务代码,而我对这三个代码都不感兴趣,所以我不在乎这些工作订单。

输出示例:

1)工作订单123456上只有VPROSWP服务代码,查询会显示出来

2)工作订单234567上同时具有VPROSWP和DPROSWP服务代码,查询会显示它们

3)工作订单345678上具有服务代码DPROSWP和DREOTLT,当我需要查看它们时,查询仅显示DPROSWP服务代码

4)工作订单456789上面有服务代码VSVCVVC,查询没有显示它,这很好,我不需要看到它。

使用Oracle SQL Developer 18.2

在此先感谢任何可以提供帮助的人。

这是我的查询:

SELECT 
O_A_WOM.ACCOUNT_NUMBER, 
O_A_WOM.WORK_ORDER_NUMBER, 
O_A_WOM.WO_TYPE, 
O_A_WOM.WO_STATUS, 
O_A_WOM.INSTALL_COMPLETION_DATE, 
O_A_WOM.EMPLOYEE_TYPE_CODE, 
O_A_WOM.ASSIGNED_INSTALLER, 
O_E_M.EMPLOYEE_NAME, 
O_E_M.REPORTS_TO, 
O_A_WOD.SERVICE_CODE, 
O_A_WOD.TO_QUANTITY
FROM 
O_A_WOD, 
O_A_WOM, 
O_E_M 
WHERE
O_A_WOD.WORK_ORDER_NUMBER = O_A_WOM.WORK_ORDER_NUMBER 
AND O_A_WOM.ASSIGNED_INSTALLER = O_E_M.EMPLOYEE_NUMBER 
AND O_E_M.SITE_ID = O_A_WOM.SITE_ID 
AND O_E_M.EMPLOYEE_TYPE_CODE = 'H3'
AND O_A_WOM.WO_STATUS IN ('CP') 
AND O_A_WOM.WO_TYPE IN ('SR', 'DW', 'UP')
AND O_E_M.REPORTS_TO in (19232) 
AND O_A_WOM.INSTALL_COMPLETION_DATE BETWEEN 1190420 AND 1190420 
AND O_A_WOD.SERVICE_CODE IN ('VPROSWP', 'TPROSWP', 'DPROSWP') 
ORDER BY O_A_WOM.WORK_ORDER_NUMBER
;

1 个答案:

答案 0 :(得分:0)

如果您将表(作为实体)解释为与您的问题有关,这将有所帮助。我们猜测是相反的。

尽管如此-我假设O_A_WOM是工作单实体,O_A_WOD是服务代码实体。 这似乎是一个逻辑问题,我认为您将不得不替换条件:

AND O_A_WOD.SERVICE_CODE IN ('VPROSWP', 'TPROSWP', 'DPROSWP') 

...带有每个必需服务代码的存在子查询-沿

AND exists (select 'x' from O_A_WOD sc1 WHERE sc1.WORK_ORDER_NUMBER = O_A_WOM.WORK_ORDER_NUMBER 
            AND sc1.SERVICE_CODE = 'VPROSWP') 
AND exists (select 'x' from O_A_WOD sc2  WHERE sc2.WORK_ORDER_NUMBER = O_A_WOM.WORK_ORDER_NUMBER 
            AND sc2.SERVICE_CODE = 'TPROSWP') 
AND exists (select 'x' from O_A_WOD sc3  WHERE sc3.WORK_ORDER_NUMBER = O_A_WOM.WORK_ORDER_NUMBER 
            AND sc3.SERVICE_CODE = 'DPROSWP') 

这意味着将只选择与所有3个服务代码匹配的工单,但将显示该订单的所有服务代码。我认为这就是您想要的。

如果不是完全正确的话(我不得不猜测是因为cos),解决方案将遵循这些原则。