首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlite2:从另一个表联接每列的最大值(子查询引用)?

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

Stack Overflow用户
提问于 2010-10-15 17:24:50
回答 1查看 1.3K关注 0票数 1

我使用的是以下数据库:

代码语言:javascript
复制
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的所有列都将被附加到这些值(行),对于datascountdatan_id的最大值的行(当然,还有name_id = n_id)。

我可以通过下面的查询在某种程度上达到这个目的:

代码语言:javascript
复制
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显式设置的行)。

问题是,每当我试图引用“当前”n_id时,SQL查询就会失败。

代码语言:javascript
复制
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=n1.n_id 
            ) 
        ) AS p1 ON n_id=name_id;

SQL error: no such column: n1.n_id

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

提前谢谢你,

干杯!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-15 18:46:43

哦,好吧--这可不是小事,但这里有一个解决方案:

代码语言:javascript
复制
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                                 

好吧,希望这能帮助到某个人,:)干杯!

注释:请注意,仅仅调用d_id(Countdata)就完全搞砸了:

代码语言:javascript
复制
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,我们必须分别对datas执行max() -然后使用完整的datas执行某种交集(除了sqlite中的交集要求在两个数据集中有相同数量的列,这在这里不是这种情况-即使我们这样做,如上所述,d_id也是错误的,因此交集将不起作用)。

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

代码语言:javascript
复制
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?)被使用,如下所示:

代码语言:javascript
复制
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        
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3940973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档