0

MAX(col) を持つテーブルから行を取得したいのですが、MAX(col) は、col の値に同じデータがある場合に複数の行を返します。私は以下のように2つのテーブルを持っています:

**Table1**
row_id INTEGER (Primary key auto incremented), 
name   TEXT

**Table2**
row_id INTEGER (Primary key auto incremented), 
ref_id INTEGER (Foreign key of Table1(row_id)), 
date_in_long TEXT, 
data   TEXT  

クエリに続いて、MAX(date_in_long) を持つ行を取得するために実行し、最後に入力された単一の行を期待しています。

SELECT DISTINCT a.name, b.row_id, b.ref_id, b.date_in_long, b.data
FROM Table1 a, Table2 b 
WHERE a.row_id=b.ref_id 
AND b.date_in_long =
(SELECT MAX(c.date_in_long) 
 FROM Table2 c 
 WHERE c.ref_id=a.row_id
)

date_in_long が ref_id に対して異なる値を持っている場合、出力結果は完璧ですが、値が同じである複数の行が返されます。例

Table1: row_id name 1 aparna
2 user1 3 XYZ

Table2: row_id ref_id date_in_long data 1 1 aparna 2 の 98 データ 1 1 aparna 3 の 100 data2 1 aparna 4 の 100 data3 2 user1 の 200 data1 5 2 user1 の 300 data2 6 3 100 XYZ の data1

上記のクエリの結果:

row_id  ref_id  name    date_in_long  data
2       1       aparna  100           data2 for aparna
3       1       aparna  100           data3 for aparna
5       2       user1   300           data2 for user1
6       3       XYZ     100           data1 for XYZ

期待される結果は次のとおりです。

row_id  ref_id  name     date_in_long  data
3       1       aparna   100           data3 for aparna
5       2       user1    300           data3 for user1
6       3       XYZ      100           data1 for XYZ

上記のクエリでどのように問題が発生するか教えてください。

以下の条件を追加します(この投稿でAlexandarが提供するソリューションとして)一部の行を除外します

AND
b.row_id = (Select MAX(c.row_id) from Table2 c where c.ref_id = b.ref_id)

上記のrow_id条件を追加した後の出力:

row_id  ref_id  name     date_in_long  data
3       1       aparna   100           data3 for aparna
6       3       XYZ      100           data1 for XYZ

USER1 の行はありません。

このクエの解き方を教えてください。

よろしくお願いします、アパルナ

4

2 に答える 2

1

問題は、「distinct」キーワードは「すべての値が他のすべての行と異なる行を返す」という意味ではなく、「他の行と何らかの形で異なる行を返す」という意味です。

したがって、row_id 2 と 3 の ref_id は同じですが、row_id とデータ列が異なります。したがって、それらは一意の行です。

1 つのオプションは、特定の ref-id の最大 row_id のみが考慮されるように、特別な条件を追加することです。

追加された条件は次のようになります。

AND
b.row_id = (Select MAX(c.row_id) from Table2 c where c.ref_id = b.ref_id)
于 2012-08-07T20:05:12.630 に答える
0

次のクエリで問題が解決します。

SELECT a.name, b.row_id, b.ref_id, b.date_in_long, b.data, MAX(date_in_long)
FROM Table1 a INNER JOIN Table2 b 
ON a.row_id=b.ref_id 
GROUP BY a.row_id

ありがとう、よろしく、アパルナ

于 2012-08-08T07:37:29.163 に答える