0

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

例如,我有这个操作 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'

谢谢

4

1 回答 1

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

于 2012-04-21T21:27:11.353 回答