【问题标题】:Oracle SQL Correlated Subquery (in WHERE statement) having no resultsOracle SQL 相关子查询(在 WHERE 语句中)没有结果
【发布时间】:2013-01-23 16:01:47
【问题描述】:

您好,感谢您的阅读,

我正在尝试使用相关子查询运行以下 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) 

【问题讨论】:

  • dpriver.com/pp/sqlformat.htm 是你的朋友。
  • 最好的猜测是最小有效时间不适用于列出的部门或事件类型之一。 where 子句只影响外部查询。
  • "clarity_adt" bbb WHERE aaa."pat_id" = bbb.pat_id 那么“clarity_adt”中有两列吗?因为您已将小写 pat_id 放在一侧(引用),而另一侧将是大写。
  • @DazzaL:所以我应该这样做:CLARITY_ADT bbb where aaa.PAT_ID = bbb.pat_id

标签: sql oracle datetime subquery correlated-subquery


【解决方案1】:

在不遍历整个语句的情况下,最简单的解决方案是使用 ROW_NUMBER 函数将语句包装在 select 中以获取最低日期。

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 语句来简化(阅读时)。所有类似的ORstatements

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

最后,我什至会通过给所有表起别名并使用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

【讨论】:

  • 当我使用 SQL 语句 3 时,它说最后一个 SELECT 语句的列定义不明确
  • @WillHoward - 为 aaa."departmentid"cd."department_id" 命名应该可以解决该错误。
  • 令人印象深刻的废话。谢谢!
【解决方案2】:

只有当日期最早的行也与clearance_adt 上的其他条件匹配时,您才会获得行。如果您想要该子集的最早记录,那么您必须将这些条件推送到子查询中。

【讨论】:

  • 我试过了,但没用:aaa.EFFECTIVE_TIME = (select min(bbb.EFFECTIVE_TIME) from CLARITY_ADT bbb where aaa.PAT_ID = bbb.pat_id AND ( aaa.department_id IN (236601,236703,236801,236901,237101,237201) ) AND aaa.EVENT_TYPE_C=3 )
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多