2016-01-06 77 views
0

請你幫我優化查詢。我們正在使用相關的子查詢來解決我們的問題。如何提高性能並刪除相關的子查詢。刪除相關的子查詢

SELECT CAST((CASE WHEN value = 1 
    THEN CASE WHEN (SELECT COUNT(records) 
        FROM ABC 
        WHERE ABC.ID = XYZ.ID) > 0 
    THEN 1 
     ELSE 0 END 
      ELSE CASE WHEN (SELECT COUNT(records) 
          FROM PQR 
          WHERE PQR.ID = XYZ.ID) > 0 
       THEN 1 
        ELSE 0 END END) AS AA) AS COLUMN FROM XYZ 
+2

那你能不能給一些樣品輸入數據和所需的輸出 - 這將有助於理解您嘗試實現的目標。 – wwkudu

+0

相關的子查詢不一定很慢。在某些情況下,它們甚至可能是最快的方法。正如Arth的回答所示,它是'EXISTS',但是你應該使用,而不是'COUNT'。爲了使這個不相關,你可以使用'IN',但是如前所述,這並不一定意味着查詢變得更快;它甚至會變慢。以任何方式確保在有問題的列上有索引。 –

回答

2

試試這個。我已經將子查詢移到了分離的臨時表中。

SELECT XYZ.id, 
     CASE WHEN XYZ.value = 1 
      THEN CASE WHEN T.cnt > 0 THEN 1 ELSE 0 END 
      ELSE CASE WHEN T2.cnt > 0 THEN 1 ELSE 0 END 
      END as column 
FROM XYZ 
    LEFT JOIN (SELECT id, COUNT(*) AS cnt FROM ABC 
       GROUP BY id) AS T ON XYZ.id = T.id 
    LEFT JOIN (SELECT id, COUNT(*) AS cnt FROM PQR 
       GROUP BY id) AS T2 ON XYZ.id = T2.id 
GROUP BY XYZ.id 

另一種解決方案。只需在表格ABC和PQR中檢查存在ID即可。感謝評論員。

SELECT XYZ.id, 
     CASE WHEN XYZ.value = 1 
      THEN T.id IS NOT NULL 
      ELSE T2.id IS NOT NULL 
      END AS column 
FROM XYZ 
    LEFT JOIN (SELECT DISTINCT id FROM ABC) AS T ON XYZ.id = T.id 
    LEFT JOIN (SELECT DISTINCT id FROM PQR) AS T2 ON XYZ.id = T2.id 
+0

此查詢可能需要更多時間,因爲它包含更多「group by」,並且與發佈的OP進行比較。 –

+0

不確定您需要選擇列中的xyz.id,還是外部查詢中的group by子句。 – Arth

+1

不需要在子查詢中按ID和計數進行分組。你可以簡單地'選擇不同的id',然後檢查't.id不是null'和't2.id不爲空'。這對於減少DBMS的工作應該快得多。 –

1

你應該儘量避免使用COUNT在這裏,你不關心有多少行是在每種情況下,只是他們是否EXIST與否。在MySQL

布爾條件TRUEFALSE分別返回10,這樣你就可以保存自己相當多的語法。

我想這是你想要的,很大程度上簡化:

SELECT (x.value =1 AND EXISTS (SELECT 1 FROM ABC a WHERE a.id = x.id)) 
     OR 
     (x.value !=1 AND EXISTS (SELECT 1 FROM PQR p WHERE p.id = x.id)) column 
    FROM XYZ x 

或可能:

SELECT EXISTS (SELECT 1 FROM ABC a WHERE a.id = x.id) column 
    FROM XYZ x 
WHERE x.value = 1 
UNION ALL 
SELECT EXISTS (SELECT 1 FROM PQR p WHERE p.id = x.id) 
    FROM XYZ x 
WHERE x.value != 1 

,或者如果你愛的情況下:

SELECT CASE 
      WHEN x.value = 1 THEN EXISTS (SELECT 1 FROM ABC a WHERE a.id = x.id) 
      ELSE EXISTS (SELECT 1 FROM PQR p WHERE p.id = x.id) 
      END column 
    FROM XYZ x