2017-08-13 34 views
0

如何在oracle中做到這一點我試着用不同的方法。在這裏,我提供的if else查詢明白我需要執行有條件的加入在oracle中的sql與否是否

if(SELECT SLS_CONT_NO FROM GL WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714') is not null 
then 
SELECT DISTINCT M.NAME FROM GL 
JOIN SALES_CONT SLS ON GL.SLS_CONT_NO = SLS.SLS_CONT_NO 
JOIN MARKETER M ON M.MKTRINIT = SLS.MKTRINIT 
WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714'; 
ELSE 
SELECT DISTINCT M.NAME FROM GL 
JOIN TANK TA ON GL.DEST_TANK=TA.TANK_NO 
JOIN MARKETER M ON M.MKTRINIT = TA.MKTRINIT 
WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714'; 
end if 
+0

你嘗試聯合或左連接(https://stackoverflow.com/questions/25074047/conditional-joining-in-oracle)或NVL(HTTPS: //stackoverflow.com/questions/36847983/oracle-sql-conditional-join)? –

回答

1

可以使用CASE WHEN語句

SELECT CASE WHEN a.SLS_CONT_NO IS NOT NULL 
      THEN (SELECT DISTINCT M.NAME 
        FROM GL b 
        JOIN SALES_CONT SLS 
         ON b.SLS_CONT_NO = SLS.SLS_CONT_NO 
        JOIN MARKETER M 
         ON M.MKTRINIT = SLS.MKTRINIT 
        WHERE b.INVNO = '67883' AND b.CUST_ID = '14714') 
      ELSE (SELECT DISTINCT M.NAME 
        FROM GL c 
        JOIN TANK TA 
         ON c.DEST_TANK = TA.TANK_NO 
        JOIN MARKETER M 
         ON M.MKTRINIT = TA.MKTRINIT 
        WHERE c.INVNO = '67883' AND c.CUST_ID = '14714') 
      END AS NAME 
FROM GL a 
WHERE a.INVNO = '67883' 
    AND a.CUST_ID = '14714'; 
+0

每個子查詢都必須返回一行。否則你的查詢將不會運行。 –

1

使用EXISTS/NOT EXISTS條款考慮一個UNION查詢,其中SELECT語句中的至少一個會返回:

SELECT M.NAME FROM GL 
JOIN SALES_CONT SLS ON GL.SLS_CONT_NO = SLS.SLS_CONT_NO 
JOIN MARKETER M ON M.MKTRINIT = SLS.MKTRINIT 
WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714' 
    AND EXISTS (SELECT SLS_CONT_NO FROM GL 
       WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714') 

UNION 

SELECT M.NAME FROM GL 
JOIN TANK TA ON GL.DEST_TANK = TA.TANK_NO 
JOIN MARKETER M ON M.MKTRINIT = TA.MKTRINIT 
WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714' 
    AND NOT EXISTS (SELECT SLS_CONT_NO FROM GL 
        WHERE GL.INVNO = '67883' AND GL.CUST_ID = '14714') 
+0

UNION返回一組唯一記錄,因此DISTINCT是不必要的。 – APC

+0

@APC ...正確。我保留OP的原始查詢而不仔細查看。 – Parfait

相關問題