2012-06-27 88 views
0

我有三個表稱爲edum_application,edua_courseEvent和edua_coursePackage。我可以以任何方式優化此SQL查詢嗎?

我正在寫一個問題,讓所有的edum_application,所有的courseEvent的coursePackage_id是X的應用程序和所有具有相同applicationWrapper_id

此查詢的工作,但它是有效的?

SELECT app.application_id, app.applicationWrapper_id 
FROM edum_application AS app 
    INNER JOIN edua_courseEvent AS ce ON app.courseEvent_id = ce.courseEvent_id 
WHERE app.applicationWrapper_id = 662 
    AND app.courseEvent_id IN 
    (
     -- Is this really efficient? 
     SELECT ce.courseEvent_id 
     FROM edua_courseEvent AS ce 
     WHERE ce.coursePackage_id = 
     (
      SELECT coursePackage_id 
      FROM edua_courseEvent AS ce 
      WHERE ce.courseEvent_id = 13377 
     ) 
    ) 

輸出:

application_id applicationWrapper_id 
72643   662 
72645   662 
72646   662 
72647   662 

回答

1

試試這個:

SELECT  app.application_id, app.applicationWrapper_id 
FROM  edum_application AS app 
INNER JOIN edua_courseEvent AS ce 
ON   app.courseEvent_id = ce.courseEvent_id 
INNER JOIN edua_courseEvent AS ce2 
ON   ce.coursePackage_id = ce2.coursePackage_id 
WHERE  app.applicationWrapper_id = 662 
AND  ce2.courseEvent_id = 13377 

您可能因中行的不同表之間/關係數需要一個DISTINCT。

+0

謝謝,但這不會返回任何結果,因爲代碼被破壞。另外,對於特定的「包裝器」,我不需要使用特定的「封裝器」,而是所有使用_courseEvents_具有相同_coursePackage_Id_的應用程序,這是我不知道何時進入此查詢的值。 – Fr3gU

+0

太棒了。這很好。我也根據執行計劃中的建議在applicationWrapper_id上創建了一個索引。謝謝! – Fr3gU