子查询:我从根本上做错了什么?

时间:2015-02-20 21:15:01

标签: sql sqlite subquery subset

我认为从SQL中的子查询中选择值只会从该子集中产生值,直到我在代码中发现一个非常讨厌的错误。这是我的问题的一个例子。

  1. 我按日期选择包含最新(最大)功能的行。这正确返回4行,每个函数的最新签入。

    select *, max(date) from cm where file_id == 5933 group by function_id;
    
  2. file_id   function_id   date             value  max(date)
    5933      64807         1407941297       1      1407941297
    5933      64808         1407941297       11     1407941297
    5933      895175        1306072348              1306072348
    5933      895178        1363182349              1363182349 
    
    1. 当仅选择上述子集中的值时,它返回先前日期的函数值,即不属于上述子集的行。您可以在下面看到日期早于第一个子集的结果。

      select temp.function_id, temp.date, temp.value
      from (select *, max(date)
            from cm
            where file_id 5933
            group by function_id) as temp;
      
    2. function_id   date          value
      
      64807         1306072348    1   <-outdated row, not in first subset
      64808         1306072348    17  <-outdated row, not in first subset
      895175        1306072348        
      895178        1363182349
      

      我从根本上做错了什么?不应该在子查询上执行选择只返回这些子查询的可能结果吗?

3 个答案:

答案 0 :(得分:1)

SQLite允许您使用MAX()来选择GROUP BY返回的行,但这只有在实际计算MAX()时才有效。 当您抛弃max(date)列时,这将不再有效。

在这种情况下,您实际上想要使用date值,因此您可以保留MAX():

SELECT function_id,
       max(date) AS date,
       value
FROM cm
WHERE file_id = 5933
GROUP BY function_id

答案 1 :(得分:0)

您似乎错过了子查询返回给定file_id的所有行的事实。如果要将子查询限制为具有最新日期的rec,则需要使用WHERE NOT EXISTS子句对其进行限制,以检查给定条件是否不存在最近的记录。

答案 2 :(得分:0)

也许我的问题没有正确制定,但是这篇文章有我一直在寻找的解决方案:

https://stackoverflow.com/a/123481/2966951

https://stackoverflow.com/a/121435/2966951

过滤掉最近一行是我的问题。我很惊讶从具有最大值的子查询中进行选择可以产生除该值之外的任何其他内容。