根据Oracle中另一个表中的最新条目从表中选择

时间:2014-09-30 06:24:09

标签: sql oracle

我在查询中有一个WHERE子句,需要查看相关表中的最新条目是否符合某些条件。但是,由于各种原因,我无法将顶级查询的PK直接注入到子句中。

有没有办法重写以下查询以依赖外部别名(即make ALIAS.pk工作)? foo有一个复合主键。

(SELECT CASE WHEN EXISTS (
    SELECT * FROM (
         SELECT n.val1, n.val2 FROM (
             SELECT * FROM foo f
             WHERE f.val0 = 100 AND f.outerid = ALIAS.pk
             ORDER BY f.date DESC
         ) n
         WHERE n.rownum = 1
    ) t
    WHERE t.val1 = 1 AND t.val2 = 2
) THEN 1 ELSE 0 END FROM dual) = 1

编辑:外表(栏):

id name city 1 Bob London 2 Mike Atlanta 3 Susan Toronto

内表(foo):

outerid date val1 val2 val100 fk1 fk2 fk3 1 2014-11-11 1 2 100 11 523 15 1 2014-11-11 1 2 101 14 12 87 1 2014-11-10 1 2 100 17 1667 12 2 2014-11-11 1 1 100 91 12 188

foo的主键是fk1..3上的复合键。 所以我需要的是从foo中选择与某个用户相对应的最新条目并检查它是否具有某些特征。

编辑2: SELECT CASE WHEN ({inner query})=1 THEN 1 ELSE 0 END WHERE id = 1应返回" 1" SELECT SELECT CASE WHEN ({inner query})=1 THEN 1 ELSE 0 END WHERE id = 2应返回" 0"。

1 个答案:

答案 0 :(得分:1)

这可能会为您提供所需的输出:

SELECT b.name
FROM bar b
     INNER JOIN
       (SELECT DISTINCT
               f.outerid
        FROM
          (SELECT f.outerid
                , f.val1
                , f.val2
                , f.date
                , max(f.date) OVER
                    (PARTITION BY f.outerid
                     ORDER BY f.date) max_date
           FROM foo f
           WHERE f.val0 = 100) f
        WHERE f.date = f.max_date
        AND f.val1 = 1
        AND f.val2 = 2) f
       ON (f.outerid = b.id)