我想写一个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'
由于
答案 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