2017-02-21 107 views
0

有沒有什麼辦法來縮短這個查詢就像使用案例,例如?如何縮短這個SQL查詢?

 SELECT ords_id 
FROM orders o 
JOIN stocks s ON o.ords_stks_id = s.stks_id 
WHERE (s.stks_print_btn_status LIKE '%901%' 
     AND o.ords_stas_id = 90 
     AND o.lsnr IS NOT NULL 
     AND o.ords_id = orderid) 
    OR (s.stks_print_btn_status LIKE '%1001%' 
     AND o.ords_stas_id = 100 
     AND o.lsnr IS NOT NULL 
     AND o.ords_id = orderid) 
    OR (s.stks_print_btn_status LIKE '%801%' 
     AND o.ords_stas_id = 80 
     AND o.lsnr IS NOT NULL 
     AND o.ords_id = orderid) 
    OR (s.stks_print_btn_status LIKE '%231%' 
     AND o.ords_stas_id = 23 
     AND o.lsnr IS NOT NULL 
     AND o.ords_id = orderid) 
+0

查找公用部分,如'o.lsnr不爲空'和'o.ords_id = orderid',你只需要它們一次。 – jarlh

回答

1

首先,您可以避免重複o.lsnr is not null and o.ords_id = orderid爲每個條件。

SELECT ords_id 
FROM orders o 
JOIN stocks s ON o.ords_stks_id = s.stks_id 
WHERE o.lsnr IS NOT NULL 
    AND o.ords_id = orderid 
    AND ((s.stks_print_btn_status LIKE '%901%' 
     AND o.ords_stas_id = 90) 
     OR (s.stks_print_btn_status LIKE '%1001%' 
      AND o.ords_stas_id = 100) 
     OR (s.stks_print_btn_status LIKE '%801%' 
      AND o.ords_stas_id = 80) 
     OR (s.stks_print_btn_status LIKE '%231%' 
      AND o.ords_stas_id = 23)) 
0

只是去掉了一些重複:

SELECT ords_id 
FROM orders o 
JOIN stocks s ON o.ords_stks_id = s.stks_id 
WHERE o.lsnr IS NOT NULL 
    AND o.ords_id = orderid 
    AND ((s.stks_print_btn_status LIKE '%901%' 
     AND o.ords_stas_id = 90) 
     OR (s.stks_print_btn_status LIKE '%1001%' 
      AND o.ords_stas_id = 100) 
     OR (s.stks_print_btn_status LIKE '%801%' 
      AND o.ords_stas_id = 80) 
     OR (s.stks_print_btn_status LIKE '%231%' 
      AND o.ords_stas_id = 23)); 
0

你到底想達到什麼目的?這是純粹縮短查詢?你可以出去這樣的事情WHERE的重複部分移動:

select ords_id 
from orders o join stocks s on o.ords_stks_id = s.stks_id 
where 
(o.lsnr is not null and o.ords_id = orderid) 
AND 
(s.STKS_PRINT_BTN_STATUS like '%901%' and o.ords_stas_id = 90) or 
(s.STKS_PRINT_BTN_STATUS like '%1001%' and o.ords_stas_id = 100) or 
(s.STKS_PRINT_BTN_STATUS like '%801%' and o.ords_stas_id = 80) or 
(s.STKS_PRINT_BTN_STATUS like '%231%' and o.ords_stas_id = 23); 

雖然去除一些重複,我想你實際上是想實現什麼東西?

1

這需要查詢從字面上 - 我認爲s.STKS_PRINT_BTN_STATUS將包含「1」追加訂單ID ...

select ords_id 
from orders o 
    join stocks s on o.ords_stks_id = s.stks_id 
where 1=1 
and o.lsnr is not null 
and o.ords_id = orderid 
and s.STKS_PRINT_BTN_STATUS LIKE '%'||o.ords_stas_id||'1%' 
and o.ords_stas_id IN (90,100,80,23) 
; 
+0

這很好。謝謝! –