2016-04-25 65 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