SQL 在多个表中选择每个连接表中的最大日期

标签 sql oracle join max

我有一个 Oracle 11 SQL 查询,我从 4 个表中提取数据,所有表均通过 ID 连接。连接到第一个表的 3 个表都有一个 ACTIVE_IND 值(需要为“Y”)和一个有效日期 (EFF_DATE),我需要每个表的最大有效日期的记录。

我有一个可以在这里使用的查询,但想知道是否有更优化/有效/高效的编写方式,因为它看起来有点慢。我目前使用的看起来像这样:

SELECT DISTINCT A.TABLE1_ID,
                A.TABLE1_COL1,
                B.TABLE2_COL2,
                C.TABLE3_COL3,
                D.TABLE4_COL4
FROM TABLE1 A,
     TABLE2 B,
     TABLE3 C,
     TABLE4 D
WHERE B.TABLE2_ID = A.TABLE1_ID
  AND B.TABLE2_ACTIVE_IND = 'Y'
  AND B.TABLE2_EFF_DATE =
    (SELECT MAX (B2.TABLE2_EFF_DATE)
     FROM TABLE2 B2
     WHERE B2.TABLE2_ID = B.TABLE2_ID
       AND B2.TABLE2_ACTIVE_IND = 'Y')
  AND C.TABLE3_ID = A.TABLE1_ID
  AND C.TABLE3_ACTIVE_IND = 'Y'
  AND C.TABLE3_EFF_DATE =
    (SELECT MAX (C2.TABLE3_EFF_DATE)
     FROM TABLE3 C2
     WHERE C2.TABLE3_ID = C.TABLE3_ID
       AND C2.TABLE3_ACTIVE_IND = 'Y')
  AND D.TABLE4_ID = A.TABLE1_ID
  AND D.TABLE4_ACTIVE_IND = 'Y'
  AND D.TABLE4_EFF_DATE =
    (SELECT MAX (D2.TABLE4_EFF_DATE)
     FROM TABLE4 D2
     WHERE D2.TABLE4_ID = D.TABLE4_ID
       AND D2.TABLE4_ACTIVE_IND = 'Y')
ORDER BY A.TABLE1_ID;

最佳答案

尝试:

SELECT DISTINCT A.TABLE1_ID,
                A.TABLE1_COL1,
                B.TABLE2_COL2,
                C.TABLE3_COL3,
                D.TABLE4_COL4
FROM TABLE1 A
JOIN (SELECT T2.*, 
             RANK() OVER (PARTITION BY TABLE2_ID ORDER BY TABLE2_EFF_DATE DESC) RN
      FROM TABLE2 T2
      WHERE TABLE2_ACTIVE_IND = 'Y') B ON B.TABLE2_ID = A.TABLE1_ID AND B.RN=1
JOIN (SELECT T3.*, 
             RANK() OVER (PARTITION BY TABLE3_ID ORDER BY TABLE3_EFF_DATE DESC) RN
      FROM TABLE3 T3
      WHERE TABLE3_ACTIVE_IND = 'Y') C ON C.TABLE3_ID = A.TABLE1_ID AND C.RN=1
JOIN (SELECT T4.*, 
             RANK() OVER (PARTITION BY TABLE4_ID ORDER BY TABLE4_EFF_DATE DESC) RN
      FROM TABLE4 T4
      WHERE TABLE4_ACTIVE_IND = 'Y') D ON D.TABLE4_ID = A.TABLE1_ID AND D.RN=1
ORDER BY A.TABLE1_ID;

关于SQL 在多个表中选择每个连接表中的最大日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344745/

相关文章:

sql - 我需要哪些索引来加速 AND/OR SQL 查询

mysql - 通过将行旋转为动态列数在 MySQL 中创建摘要 View

sql - 如何从 Oracle SQL 中的字符串中删除前导 0?

oracle - 创建每 5 分钟刷新一次的物化 View

mysql 连接并计算字段值

mysql - 我可以将带有 JOIN 的 SQL 语句分解为更小的查询或优化查询吗?

sql - 在sql数据库中查询

Oracle 到 Postgres SQL 语法转换

mysql - 复杂的连接/联合查询

MYSQL 查询将列名与另一个表中的行匹配