sql - 使用 MAX() 时避免子选择

标签 sql db2

有什么方法可以避免这种子选择吗? 我试图使这个查询尽可能高效,并在这样做时试图避免子选择。

我正在查找表中 ID_NUM 最近被替换的行。

子选择已就位,因此我只返回最近替换的行。这是最好的方法吗?

查询完美地按照我想要的方式工作,因此请随意忽略最后一个小子选择。

SELECT   
  A.ID_NUM,
  A.DOB,
  A.NAME,
  A.REPLACED_TMESTMP  
FROM MYTABLE A, MYTABLE B  
WHERE   
  A.ID_NUM = B.ID_NUM
  AND A.REPLACED_TMESTMP IS NOT NULL
  AND B.REPLACED_TMESTMP IS NULL
  AND A.DOB <> B.DOB
  several other conditions...

  AND A.REPLACED_TMESTMP  
    = (SELECT MAX(C.REPLACED_TMESTMP)  
      FROM MYTABLE C  
      WHERE C.ID_NUM = A.ID_NUM  
      AND A.REPLACED_TMESTMP IS NOT NULL  
      )
; 

这里有一些伪代码可以帮助您理解我需要做什么

Select all from table
where a duplicate ID number exists
    that has an active row (no replaced time stamp)
    and has an inactive row(s)
    only bring back the most current replaced row for each ID num.

最佳答案

您可以将子选择重写为JOIN。我们在工作中的一个表上有类似的设置(其中每个“事物”有多个“行”,但您只处理“最新”的一个),我运行了一个子选择类型查询,通过 VisualExplain 生成一个 JOIN 类型,根据估计,JOIN 的处理时间会少很多 CPU 秒(当然,这只是一个估计,并且你的 table 可能和我的有很大不同,所以对此持保留态度)。

我稍微更改了查询,我认为这应该包含您要查找的所有信息。

SELECT INACTIVE.ID_NUM
      ,INACTIVE.DOB
      ,INACTIVE.NAME,
      ,INACTIVE.REPLACED_TMESTMP  
FROM (
    SELECT *
    FROM MYTABLE
    WHERE REPLACED_TMESTMP IS NULL
) AS ACTIVE
JOIN (
    SELECT *
    FROM MYTABLE
    WHERE REPLACED_TMESTMP IS NOT NULL
) AS INACTIVE
  ON ACTIVE.ID_NUM = INACTIVE.ID_NUM
 AND ACTIVE.DOB   <> INACTIVE.DOB
  -- several other conditions...

JOIN (
    SELECT ID_NUM,
           MAX(REPLACED_TMESTMP) AS TIMESTAMP
    FROM MYTABLE
    GROUP BY ID_NUM
) MAX_REPLACE
  ON INACTIVE.ID_NUM           = MAX_REPLACE.ID_NUM
 AND INACTIVE.REPLACED_TMESTMP = MAX_REPLACE.TIMESTAMP

关于sql - 使用 MAX() 时避免子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11869533/

相关文章:

mysql - SQL 在自引用表中查找祖先/后代

java - 如何在循环内相应地将数据存储在数据库列中

sql - 带有 "or"运算符的 DB2 SQL 正则表达式

mysql - 将 SQL 语句中的 NOT IN 替换为 LEFT JOIN

sql - Oracle 中的查询错误

mysql - 从mysql数据库获取最大计数

php - 在段落中插入数字 ID(PHP/MySQL DB 查询)

sql - SQL日期间隔算法

ssl - db2 仓库 : How to connect using SSL with ibm data server driver

sql - db2 特定于不同行数的查询