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
.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|||
...しかし - 明らかに - それは単一の行でのみ機能します(1つは明示的に設定されています name_id=1
).
問題は、「電流」を何らかの形で参照しようとすると、SQLクエリが失敗することです。 n_id
:
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
, 、私たちはしなければなりません max()
の上 datas
別々に - それから完全なものと交差するようなものを実行します datas
(sqliteで交差することを除いて、両方のデータセットに等しい数の列があることを要求しますが、ここではそうではありません - そして、たとえ上記のように、私たちがそれを作ったとしても、 d_id
間違っているので、交差することは機能しません).
それを行う1つの方法は、一種の一時テーブルを使用してから、複数のテーブル選択クエリを使用して、完全な間に条件を設定することです。 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;
または、上記を書き換えることができます。そうすることで、選択したサブクエリ(サブセレクト?)が使用されます。
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