2016-04-25 71 views
1

我有以下SQL语句:的Oracle SQL条件加入

select 
    DOCUMENT.DOCUMENT_ID, 
    (case 
     when DOCUMENT.CLASSIFICATION_CODE is not null 
     then DOCUMENT.CLASSIFICATION_CODE 
     else TEMPLATE.CLASSIFICATION_CODE end) CLASSIFICATION_CODE, 
    CLASSIFICATION.NAME CLASSIFICATION_NAME 
from 
    DOCUMENT, 
    TEMPLATE, 
    CLASSIFICATION 
where 
    DOCUMENT.TEMPLATE_ID = TEMPLATE.TEMPLATE_ID and 
    DOCUMENT.CLASSIFICATION_CODE = CLASSIFICATION.CLASSIFICATION_CODE(+) 

我想这样做是线沿线的:

if DOCUMENT.CLASSIFICATION_CODE IS NOT NULL THEN 
    DOCUMENT.CLASSIFICATION_CODE = CLASSIFICATION.CLASSIFICATION_CODE(+), 
ELSE 
    TEMPLATE.CLASSIFICATION_CODE = CLASSIFICATION.CLASSIFICATION_CODE(+) 

这可能吗?

+0

学习使用正确的显式'JOIN'语法。谁能记住'(+)'在WHERE子句中的含义? –

+0

UGH!非ANSI外连接语法?在2016年!?!?!这个世界到底是什么! – ErikE

回答

1

您可以使用NVL或更多的标准COALESCE为:

COALESCE(DOCUMENT.CLASSIFICATION_CODE, TEMPLATE.CLASSIFICATION_CODE) 
     = CLASSIFICATION.CLASSIFICATION_CODE(+) 

在ANSI语法:

select 
    DOCUMENT.DOCUMENT_ID, 
    COALESCE(DOCUMENT.CLASSIFICATION_CODE, TEMPLATE.CLASSIFICATION_CODE) 
     CLASSIFICATION_CODE, 
    CLASSIFICATION.NAME CLASSIFICATION_NAME 
from 
    DOCUMENT 
inner join 
    TEMPLATE on DOCUMENT.TEMPLATE_ID = TEMPLATE.TEMPLATE_ID 
left join 
    CLASSIFICATION on 
     COALESCE(DOCUMENT.CLASSIFICATION_CODE, TEMPLATE.CLASSIFICATION_CODE) 
     = CLASSIFICATION.CLASSIFICATION_CODE 
+0

这就像一个魅力,谢谢! –

0

您可以使用:

  • NVL(DOCUMENT.CLASSIFICATION_CODE, TEMPLATE.CLASSIFICATION_CODE)
  • COALESCE(DOCUMENT.CLASSIFICATION_CODE, TEMPLATE.CLASSIFICATION_CODE)
  • CASE WHEN DOCUMENT.CLASSIFICATION_CODE IS NOT NULL THEN DOCUMENT.CLASSIFICATION_CODE ELSE TEMPLATE.CLASSIFICATION_CODE END(完全是你的SELECT子句中使用)

连接条件,如:

SELECT d.DOCUMENT_ID, 
     NVL(d.CLASSIFICATION_CODE, t.CLASSIFICATION_CODE) 
     AS CLASSIFICATION_CODE, 
     c.NAME AS CLASSIFICATION_NAME 
FROM DOCUMENT d 
     INNER JOIN TEMPLATE t 
     ON (d.TEMPLATE_ID = t.TEMPLATE_ID) 
     LEFT OUTER JOIN CLASSIFICATION c 
     ON (NVL(d.CLASSIFICATION_CODE, t.CLASSIFICATION_CODE) 
       = c.CLASSIFICATION_CODE) 
1

虽然可以使用​​3210或nvl,如其他答案建议,我宁愿两次加入classification表。是的,引擎必须执行额外的连接,但避免这些功能允许引擎使用索引。

SELECT document.document_id, 
     COALESCE (d.classification_code, t.classification_code) 
      AS classification_code, 
     COALESCE (d_c.name, t_c.name) AS classification_name 
FROM document d 
     JOIN template t ON d.template_id = t.template_id 
     LEFT JOIN classification d_c 
      ON d.classification_code = d_c.classification_code 
     LEFT JOIN classification t_c 
      ON t.classification_code = t_c.classification_code