Join sqlite2:从另一个表(子查询引用)联接每列的最大值?
我正在使用以下数据库:Join sqlite2:从另一个表(子查询引用)联接每列的最大值?,join,subquery,max,sqlite2,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); INSER
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');
我想做的是,选择名称
的所有值(行)——所有数据列都将附加到这些值(行)
,因为数据
计数数据
对于n\u id
(当然,其中name\u id=n\u 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\u id=1
显式设置的行)
问题是,每当我试图以某种方式引用“当前”id时,SQL查询就会失败:
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中想要的吗
提前感谢,
干杯 哦,这一点都不微不足道,但这里有一个解决方案:
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
,我们必须分别对datas
执行max()
,然后对完整的数据执行某种相交(除了sqlite中的intersect要求两个数据集中的列数相等之外,这里的情况不是这样的——即使我们这样做,如上所示,d_id
将是错误的,因此intersect将不起作用)
一种方法是使用一种临时表,然后使用多表选择查询,以便在完整的数据
和通过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;
或者,我们可以重写上述内容,以便使用选择子查询(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