3

android noob ... country_tblとcity_tblの間に1対多の関係がある2つのテーブルがあり、city_tbl.landmark_colの値をGROUP_CONCAT()で連結し、すべてのlandmark_col値を単一の文字列としてcountry_tbl.all_landmarksに挿入したいと思います桁。SQL では、landmark_col 値を country_tbl に渡す前に連結するために、ネストされた SELECT が必要なようです...次のようなものです。

UPDATE country_tbl 
SET country_tbl.all_landmarks = (SELECT landmarks_col FROM 
                                    (SELECT country_id, group_concat(landmarks_col) 
                                            FROM city_tbl INNER JOIN country_tbl
                                            ON country_tbl.country_id = city_tbl.country_id
                                            GROUP BY country_tbl.country_id) 
                                    AS country_landmarks      
                                WHERE country_tbl.country_id = country_landmarks.country_id)
WHERE
EXISTS (
    SELECT *
    FROM country_landmarks
    WHERE country_tbl.country_id = country_landmarks.country_id
);

ネストされた select ステートメントがサポートされているかどうか、またはリソースを大量に消費するかどうかはわかりません... rawQuery を使用することが最善の解決策ではないように思われるため、より良い方法があるはずです。ContentProviders を使用するか、カーソルを渡すか、一時テーブルを作成する必要があるかどうかわかりません...?

4

1 に答える 1

4

長い SQL クエリを 2 つの部分に分割することで、これに答えました。まず、SQLiteQueryBuilder でサブクエリを作成し、rawQuery を使用して実行し、landmark_names の location_id と group_concat の値を持つ 2 列のカーソルを取得しました。次に、カーソルを循環させて、その国のすべてのランドマーク名の適切な連結値のそれぞれで国テーブルを更新することができました。

以下のクエリは、上の質問 (投稿する前に単純化したもの) よりも少し複雑です。これは、landmarks リスト テーブルを別の landmark_type テーブルに、landmark_type_id で結合する必要があり、私の本当の目標は、landmark_type の短いリストを連結することだったからです。国ごとのすべての landname_names の長いリストではありません。とにかく、それは動作します。

    public void UpdateCountryLandmarks() throws SQLException {
    Cursor c = null;
    String subquery = SQLiteQueryBuilder.buildQueryString(
            // include distinct
            true,
            // FROM tables
            LANDMARK_TYPE_TABLE + "," + LANDMARKS_TABLE,
            // two columns (one of which is a group_concat()
            new String[] { LANDMARKS_TABLE + "." + LOCATION_ID + ", group_concat(" + LANDMARK_TYPE_TABLE + "." + LANDMARK_TYPE + ",\", \") AS " + LANDMARK_NAMES },
            // where
            LANDMARK_TYPE_TABLE + "." + LANDMARK_ID + "=" + LANDMARKS_TABLE + "." + LANDMARK_TYPE_ID,
            // group by
            LANDMARKS_TABLE + "." + LOCATION_ID, null, null, null);

    c = mDb.rawQuery(subquery, null);

    if (c.moveToFirst()) {
        do {
            String locationId = c.getString(c.getColumnIndex(LOCATION_ID));
            String landmarkNames = c.getString(c.getColumnIndex(LANDMARK_NAMES));
            ContentValues cv = new ContentValues();
            cv.put(LANDMARK_NAMES, landmarkNames);
            mDb.update(COUNTRY_TABLE, cv, LOCATION_ID + "=" + locationId, null);
        } while (c.moveToNext());
    }

    c.close();

    }
于 2012-06-15T07:41:15.040 に答える