甲骨文。如何使用IN运算符和OUTER JOIN处理外部字段

时间:2016-08-08 11:08:28

标签: oracle join outer-join

我写了这样的查询

SELECT * 
FROM (SELECT 
          TABLE2.VAL AS VAL1,
          TABLE2.VAL AS VAL2,
          TABLE2.VAL AS VAL3,
          TABLE2.VAL AS VAL4,
          TABLE2.VAL AS VAL5,
          TABLE2.VAL AS VAL6,
          CASE 
             WHEN VAL1 IS NULL THEN '10'
             WHEN VAL3 IS NULL THEN '20'
             WHEN VAL5 IS NULL THEN '30'
             ELSE '40' 
          END PROGRESS
      FROM 
          TABLE1, TABLE2
      WHERE 
          TABLE1.KEY = TABLE2.KEY(+)
          TABLE2.COND IN ('1','2','3','4','5','6')
) 
WHERE 
    PROGRESS > '20'

此查询无效。

中有错误
,CASE WHEN VAL1 IS NULL THEN '10'
      WHEN VAL3 IS NULL THEN '20'
      WHEN VAL5 IS NULL THEN '30'
      ELSE '40' END PROGRESS

这一部分。错误说VAL1是不一致的。

如果我像这样使用

,我可以解决这个问题
FROM TABLE2 TB2_1, TABLE2 TB2_2, TABLE3 TB2_3
WHERE TB2_1.KEY(+) = TABLE1.KEY AND TB2_2.KEY(+) = TABLE1.KEY 

多次声明相同的表,但

我不想这样做,因为真正的查询比这复杂得多。

有什么方法可以区分这样的外表吗?

,CASE WHEN TABLE2[1].VAL IS NULL THEN '10'
      WHEN TABLE2[2].VAL IS NULL THEN '20'
      WHEN TABLE2[3].VAL IS NULL THEN '30'
      ELSE '40' END PROGRESS

或任何其他方式。请帮助:)

2 个答案:

答案 0 :(得分:0)

使用正确的显式JOIN语法:

SELECT . . .
FROM TABLE1 LEFT JOIN
     TABLE2
     ON TABLE1.KEY = TABLE2.KEY AND
        TABLE2.COND IN ('1','2','3','4','5','6')

简单规则:从不FROM子句中使用逗号。 始终使用明确的JOIN语法。

答案 1 :(得分:0)

请勿在{{1​​}}声明中使用别名:

CASE

我不知道你的CASE WHEN TABLE2.VAL IS NULL THEN '10' WHEN TABLE2.VAL IS NULL THEN '20' WHEN TABLE2.VAL IS NULL THEN '30' ELSE '40' END PROGRESS 语句的含义是什么,因为它有6次相同的列别名,但希望这个答案至少会删除你当前的错误。

您还应该接受@Gordon的建议,并使用明确的左(外)联接。您正在使用的语法很难阅读。