sqlite2:从另一个表(子查询引用)中连接每列的最大值?

时间:2010-10-15 09:24:50

标签: join subquery max sqlite2

我正在使用以下数据库:

CREATE TABLE datas (d_id INTEGER PRIMARY KEY, name_id numeric, countdata numeric);
INSERT INTO datas VALUES(1,1,20);  //(NULL,1,20);
INSERT INTO datas VALUES(2,1,47);  //(NULL,1,47);
INSERT INTO datas VALUES(3,2,36);  //(NULL,2,36);
INSERT INTO datas VALUES(4,2,58);  //(NULL,2,58);
INSERT INTO datas VALUES(5,2,87);  //(NULL,2,87);
CREATE TABLE names (n_id INTEGER PRIMARY KEY, name text);
INSERT INTO names VALUES(1,'nameA'); //(NULL,'nameA');
INSERT INTO names VALUES(2,'nameB'); //(NULL,'nameB');

我想要做的是选择names的所有值(行) - datas的所有列都将附加到datas的行。{ {1}}是countdata的最大值(当然还有n_id)。

我可以通过以下查询来实现:

name_id = n_id

...但是 - 很明显 - 它只适用于单行(由sqlite> .header ON sqlite> SELECT * FROM names AS n1 LEFT OUTER JOIN ( SELECT d_id, name_id, countdata FROM datas AS d1 WHERE d1.countdata IN ( SELECT MAX(countdata) FROM datas WHERE name_id=1 ) ) AS p1 ON n_id=name_id; n1.n_id|n1.name|p1.d_id|p1.name_id|p1.countdata 1|nameA|2|1|47 2|nameB||| 明确设置的行)。

问题是,每当我尝试以某种方式引用“当前”name_id=1时,SQL查询都会失败:

n_id

有没有办法在Sqlite2中实现我想要的东西?

提前致谢,

干杯!

1 个答案:

答案 0 :(得分:2)

哦,好吧 - 这根本不是微不足道的,但这是一个解决方案:

sqlite> SELECT * FROM names AS n1 
        LEFT OUTER JOIN ( 
            SELECT d1.* 
            FROM datas AS d1, ( 
                SELECT max(countdata) as countdata,name_id 
                FROM datas 
                GROUP BY name_id
                ) AS ttemp 
            WHERE d1.name_id = ttemp.name_id AND d1.countdata = ttemp.countdata 
        ) AS p1 ON n1.n_id=p1.name_id;


n1.n  n1.name       p1.d_id     p1.name_id  p1.countdata                       
----  ------------  ----------  ----------  -----------------------------------
1     nameA         2           1           47                                 
2     nameB         5           2           87                                 

嗯,希望这最终帮助某人,:) 干杯!

备注:请注意,只需调用max(countdata)即可d_id

sqlite> select d_id,name_id,max(countdata) as countdata from datas group by name_id;

d_id  name_id       countdata 
----  ------------  ----------
3     2             87        
1     1             47        

为了获得正确的对应d_id,我们必须分别在max()datas - 然后执行与完整datas的交叉排序(除外在sqlite中相交的要求在两个数据集中都有相同数量的列,这不是这里的情况 - 即使我们这样做,如上所述d_id也是错误的,因此相交不起作用< / em>的)。

一种方法是使用一种临时表,然后利用多表SELECT查询,以便在完整datas和通过max(countdata)返回的子集之间设置条件,如如下所示:

sqlite> CREATE TABLE ttemp AS SELECT max(countdata) as countdata,name_id FROM datas GROUP BY name_id;
sqlite> SELECT d1.*, ttemp.* FROM datas AS d1, ttemp WHERE d1.name_id = ttemp.name_id AND d1.countdata = ttemp.countdata;

d1.d  d1.name_id    d1.countda  ttemp.coun  ttemp.name_id                      
----  ------------  ----------  ----------  -----------------------------------
2     1             47          47          1                                  
5     2             87          87          2                                  

sqlite> DROP TABLE ttemp;

或者,我们可以重写上面所以使用SELECT子查询(sub-select?),如下所示:

sqlite> SELECT d1.* FROM datas AS d1, (SELECT max(countdata) as countdata,name_id FROM datas GROUP BY name_id) AS ttemp WHERE d1.name_id = ttemp.name_id AND d1.countdata = ttemp.countdata;

d1.d  d1.name_id    d1.countda
----  ------------  ----------
2     1             47        
5     2             87