2013-01-23 80 views
0

你好,感謝您的閱讀,的Oracle SQL相關子查詢(在WHERE語句)無結果

我試圖運行與相關子查詢以下SQL查詢和它帶回沒有結果。我正在使用子查詢來僅返回具有最低日期範圍的結果。單獨的查詢和子查詢都能正常工作。

任何想法?我錯誤地鏈接了相關的子查詢嗎?

注:相關子查詢的查詢

謝謝你的最後一行, Willz06jw

SELECT aaa."effective_time", 
     aaa."event_type_c", 
     "clarity_dep"."department_name", 
     "patient"."birth_date", 
     "patient"."pat_mrn_id", 
     "zc_ped_delivr_meth"."name", 
     "zc_ped_delivr_meth"."ped_delivr_meth_c", 
     aaa."department_id", 
     "clarity_dep"."department_id", 
     aaa."alt_event_type_c", 
     aaa."in_event_type_c" 
FROM (("CLARITY"."clarity_adt" aaa 
     inner join "CLARITY"."clarity_dep" "CLARITY_DEP" 
       ON aaa."department_id" = "clarity_dep"."department_id") 
     inner join "CLARITY"."patient" "PATIENT" 
       ON aaa."pat_id" = "patient"."pat_id") 
     inner join "CLARITY"."zc_ped_delivr_meth" "ZC_PED_DELIVR_METH" 
       ON "patient"."ped_delivr_meth_c" = 
        "zc_ped_delivr_meth"."ped_delivr_meth_c" 
WHERE ("patient"."birth_date" >= To_date ('01-12-2012 00:00:00', 
              'DD-MM-YYYY HH24:MI:SS') 
     AND "patient"."birth_date" < To_date ('06-12-2012 00:00:00', 
             'DD-MM-YYYY HH24:MI:SS' 
            )) 
     AND (aaa."department_id" = 236601 
       OR aaa."department_id" = 236703 
       OR aaa."department_id" = 236801 
       OR aaa."department_id" = 236901 
       OR aaa."department_id" = 237101 
       OR aaa."department_id" = 237201) 
     AND aaa."event_type_c" = 3 
     AND aaa."effective_time" = (SELECT Min(bbb."effective_time") 
            FROM "clarity_adt" bbb 
            WHERE aaa."pat_id" = bbb.pat_id) 
+0

http://www.dpriver.com/pp/sqlformat.htm是你的朋友。 – danihp

+0

最好的猜測是最小effective_time不適用於列出的部門或事件類型之一。 where子句隻影響外部查詢。 –

+0

'「clarity_adt」bbb WHERE aaa。「pat_id」= bbb.pat_id'因此在「clarity_adt」中有兩列嗎?因爲你已經把小寫pat_id放在一邊(引用),而另一邊是大寫。 – DazzaL

回答

2

沒有通過整個語句zifting,最簡單的解決辦法是隻是包裝的聲明在選擇使用ROW_NUMBER函數來獲取最低日期。

SQL語句1

SELECT * 
FROM (
      SELECT ROW_NUMBER() OVER (PARTITION BY pat_id ORDER BY effective_time) AS rn, 
       aaa."effective_time", 
       aaa."event_type_c", 
       "clarity_dep"."department_name", 
       "patient"."birth_date", 
       "patient"."pat_mrn_id", 
       "zc_ped_delivr_meth"."name", 
       "zc_ped_delivr_meth"."ped_delivr_meth_c", 
       aaa."department_id", 
       "clarity_dep"."department_id", 
       aaa."alt_event_type_c", 
       aaa."in_event_type_c" 
      FROM "CLARITY"."clarity_adt" aaa 
       inner join "CLARITY"."clarity_dep" "CLARITY_DEP" ON aaa."department_id" = "clarity_dep"."department_id" 
       inner join "CLARITY"."patient" "PATIENT" ON aaa."pat_id" = "patient"."pat_id" 
       inner join "CLARITY"."zc_ped_delivr_meth" "ZC_PED_DELIVR_METH" ON "patient"."ped_delivr_meth_c" = "zc_ped_delivr_meth"."ped_delivr_meth_c" 
      WHERE ("patient"."birth_date" >= To_date ('01-12-2012 00:00:00', 'DD-MM-YYYY HH24:MI:SS') 
       AND "patient"."birth_date" < To_date ('06-12-2012 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) 
       AND (aaa."department_id" = 236601 OR aaa."department_id" = 236703 OR aaa."department_id" = 236801 OR aaa."department_id" = 236901 OR aaa."department_id" = 237101 OR aaa."department_id" = 237201) 
       AND aaa."event_type_c" = 3 
     ) q 
WHERE q.rn = 1 

你的語句可以通過使用IN聲明IO簡化(在閱讀它)。所有OR之類的語句,例如

SQL語句2

SELECT * 
FROM (
      SELECT ROW_NUMBER() OVER (PARTITION BY pat_id ORDER BY effective_time) AS rn, 
       aaa."effective_time", 
       aaa."event_type_c", 
       "clarity_dep"."department_name", 
       "patient"."birth_date", 
       "patient"."pat_mrn_id", 
       "zc_ped_delivr_meth"."name", 
       "zc_ped_delivr_meth"."ped_delivr_meth_c", 
       aaa."department_id", 
       "clarity_dep"."department_id", 
       aaa."alt_event_type_c", 
       aaa."in_event_type_c" 
      FROM "CLARITY"."clarity_adt" aaa 
       inner join "CLARITY"."clarity_dep" "CLARITY_DEP" ON aaa."department_id" = "clarity_dep"."department_id" 
       inner join "CLARITY"."patient" "PATIENT" ON aaa."pat_id" = "patient"."pat_id" 
       inner join "CLARITY"."zc_ped_delivr_meth" "ZC_PED_DELIVR_METH" ON "patient"."ped_delivr_meth_c" = "zc_ped_delivr_meth"."ped_delivr_meth_c" 
      WHERE ("patient"."birth_date" >= To_date ('01-12-2012 00:00:00', 'DD-MM-YYYY HH24:MI:SS') 
       AND "patient"."birth_date" < To_date ('06-12-2012 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) 
       AND (aaa."department_id" IN (236601,236703,236801,236901,237101,237201)) 
       AND aaa."event_type_c" = 3 
     ) q 
WHERE q.rn = 1 

最後,我甚至會進一步aliassing所有表簡化它,並使用WITH聲明。最後的結果是這樣的

SQL語句3

;WITH q AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY pat_id ORDER BY effective_time) AS rn, 
     aaa."effective_time", 
     aaa."event_type_c", 
     cd."department_name", 
     p."birth_date", 
     p."pat_mrn_id", 
     pdm."name", 
     pdm."ped_delivr_meth_c", 
     aaa."department_id", 
     cd."department_id", 
     aaa."alt_event_type_c", 
     aaa."in_event_type_c" 
    FROM "CLARITY"."clarity_adt" aaa 
     inner join "CLARITY"."clarity_dep" cd ON aaa."department_id" = cd."department_id" 
     inner join "CLARITY"."patient" p ON aaa."pat_id" = p."pat_id" 
     inner join "CLARITY"."zc_ped_delivr_meth" pdm ON p."ped_delivr_meth_c" = pdm."ped_delivr_meth_c" 
    WHERE p."birth_date" >= To_date ('01-12-2012 00:00:00', 'DD-MM-YYYY HH24:MI:SS' 
     AND p."birth_date" < To_date ('06-12-2012 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) 
     AND aaa."department_id" IN (236601,236703,236801,236901,237101,237201) 
     AND aaa."event_type_c" = 3 
) 
SELECT * 
FROM q 
WHERE rn = 1 
+0

當我使用SQL語句3 - 它表示最後的SELECT語句有一個明確定義的列 –

+1

@WillHoward - Aliassing 「aaa。」或「cd。」department_id「'應該可以解決該錯誤。 –

+0

令人印象深刻的廢話。謝謝! –

0

你只會變得行如果與最早的日期行也匹配上clarity_adt的其他條件。如果你想要那個子集的最早記錄,那麼你必須將這些條件推入子查詢中。

+0

我試過了,它沒有工作:'aaa.EFFECTIVE_TIME =(從CLARITY_ADT bbb選擇min(bbb.EFFECTIVE_TIME),其中aaa.PAT_ID = bbb.pat_id AND(aaa.department_id IN(236601,236703,236801,236901,237101, 237201)) AND aaa.EVENT_TYPE_C = 3)' –