安卓Noob…我有两个表,country和city之间有一对多的关系,我想将city-tbl.landmark-col中的值与group-concat()连接起来,并将所有landmark-col值作为一个字符串插入country-tbl.all-landmarks列。sql似乎需要一个嵌套的select来连接landmark col值,然后再将它们传递给country tbl…类似于:

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或传递游标…?

最佳答案

我通过将长sql查询分成两部分来回答这个问题。首先,我使用sqlitequerybuilder创建了一个子查询,并使用rawquery运行该子查询以获得一个两列游标,其中包含地标名的位置id和组concat值。然后,我可以循环光标,用该国所有地标名称的每个适当连接值更新country表。
下面的查询比上面的问题稍微复杂一点(我在发布之前简化了这个问题),只是因为我必须按照landmark类型id将landmarks列表表与另一个landmark类型表连接起来,而我的真正目标是按国家而不是按他按国家列出了所有地标性建筑的名字。不管怎样,它是有效的。

    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();

    }

07-28 01:40