SQL查询即使找不到也返回一行,至少在参数中

时间:2012-04-21 21:04:38

标签: oracle

我想写一个SQL查询(oracle) 知道一个操作(由ope.ope_operationid标识) 至少具有某种类型的操作(opt.opt_id),如果没有,则表明它不在结果中。

例如,我有这个操作LAA351BP(我知道这个存在于base), 我想知道它是否至少有一个id为3781的操作类型。 如果有,则打印所有内容,如果没有,则打印操作ID 和旁边的“找不到”之类的东西

是否使用nvl功能?好像我无法让它正常工作。

SELECT  DISTINCT ope.ope_operationid,
ser.ser_code,
opt.opt_code,
ost.ost_code
FROM    od_operation ope, 
od_service_type ser,
od_operation_type opt,
od_status_type ost,
od_equipment_type eqt,
WHERE   ope.ser_id = ser.ser_id
AND     opt.opt_id = ope.opt_id
AND     ost.ost_id = ope.ost_id
AND     ope.opt_id = 3781
AND     ope.ope_operationid = 'LAA351BP'

由于

1 个答案:

答案 0 :(得分:5)

您应该开始使用标准JOIN语法。除了更具可读性(至少在我看来),如果您忘记了WHERE子句中的实际连接条件,它还可以保护您免受偶然的笛卡尔连接。此外,它几乎可以在所有DBMS中移植,而不是Oracle使用的笨重的(+)语法(它也有一些JOIN语法没有的限制)

以下是使用显式(而非隐式)连接重写的查询:

SELECT DISTINCT ope.ope_operationid,
       ser.ser_code,
       opt.opt_code,
       ost.ost_code
FROM od_operation ope, 
   LEFT JOIN od_service_type ser ON ope.ser_id = ser.ser_id
   LEFT JOIN od_operation_type opt ON opt.opt_id = ope.opt_id
   LEFT JOIN od_status_type ost ON ost.ost_id = ope.ost_id
   LEFT JOIN od_equipment_type eqt ON ????????
WHERE ope.opt_id = 3781
AND   ope.ope_operationid = 'LAA351BP'

修改

od_equipment_type上缺少的连接条件正是首选JOIN语法的原因。如果删除了原始SQL中的尾随逗号,则该语句将创建不需要的笛卡尔联接,如果涉及的表很大,则可能会对服务器产生严重影响。

使用JOIN语法,您将始终遇到语法错误,这会阻止您进行此类拼写错误。使用隐式联接只会在FROM列表中留下逗号时出现错误,但如果错过WHERE

中的连接条件,则永远不会出错