2014-01-18 3 views
0

Я создал этот запрос, который берет данные из 2 таблиц. Но кажется, что g.filed_1 добавляется и умножается, потому что, например, если сумма g.filed_1 равна 20, запрос возвращает 40. Может быть, есть синтаксические ошибки? СпасибоAndroid java SELECT SQLite

private void calc() { 
SQLiteDatabase db = mHelper.getReadableDatabase(); 
String tab = "SELECT SUM(c.field_init), SUM(g.filed_1), SUM(g.field_2) FROM Cserv c, Bserv g"; 
Cursor c = db.rawQuery(tab, null); 
if (c.moveToNext()) { 
    sumfield_init = c.getDouble(0); 
    sumfield_1 = c.getDouble(1); 
    sumfield_2 = c.getDouble(2); 
... 
} 
     c.close(); 
     db.close(); 
    } 

ответ

3

Вы не указали, как присоединиться к таблицам. Поэтому запрос генерирует все возможные комбинации записей в Cserv и Bserv. То, что вы получили в два раза больше суммы, означает, что другая таблица содержит только две записи.

Как правило, в каждой таблице будет один столбец, который должен иметь то же значение в результате JOIN. Предполагая, что эти столбцы называются x и y, необходимо указать его таким образом:

SELECT SUM(c.field_init), SUM(g.filed_1), SUM(g.field_2) FROM Cserv c JOIN Bserv g 
    ON c.x = g.y 
+0

Вы правы, но как мне решить эту проблему? – user3160725

+0

@ user3160725 см. Обновленный ответ – Henry

+0

проблема в том, что таблицы не имеют равного поля. то объединение полей не может быть применено. – user3160725

0
specify the column names as i did below  

private void calc() { 
SQLiteDatabase db = mHelper.getReadableDatabase(); 
String tab = "SELECT SUM(c.field_init), SUM(g.filed_1), SUM(g.field_2) 
FROM Cserv c.KEY FROM THIS TABLE JOIN Bserv g.KEY FROM Bserv"; 
Cursor c = db.rawQuery(tab, null); 
if (c.moveToNext()) { 
sumfield_init = c.getDouble(0); 
sumfield_1 = c.getDouble(1); 
sumfield_2 = c.getDouble(2); 
... 
} 
    c.close(); 
    db.close(); 
} 
+0

у вас есть идеи? Я не могу войти в систему. не имеют равного поля. – user3160725

0

проблема заключается в том, что таблицы не имеют равное поле. то объединение полей не может быть применено. - user3160725

Если вы хотите, отдельные суммы в одном запросе, вы можете объединить отдельные запросы в один без выполнения JOIN между двумя таблицами. Есть много способов сделать это, и вы можете выбрать то, что делает большинство смысла для вас:

Индивид суммы следующим образом:

SELECT SUM(c.field_init) FROM Cserv c; --x 
SELECT SUM(g.filed_1) FROM Bserv g; --y 
SELECT SUM(g.field_2) FROM Bserv g; --z 

Метод 1. Вы можете объединить их в подзапросов в основной запрос:

SELECT 
    (SELECT SUM(c.field_init) FROM Cserv c), 
    (SELECT SUM(g.filed_1) FROM Bserv g), 
    (SELECT SUM(g.field_2) FROM Bserv g); 

Здесь вы получаете каждую сумму в подзапросе как столбец в основном запросе. Обратите внимание: каждый подзапрос должен иметь ровно один столбец и одну строку.

x  y  z 

Метод 2. Вы можете объединить их агрегацией:

SELECT SUM(sum1), SUM(sum2), SUM(sum3) FROM (
    (SELECT SUM(c.field_init) AS sum1, 0 AS sum2, 0 AS sum3 FROM Cserv c) 
    UNION ALL 
    (SELECT 0, SUM(g.filed_1), SUM(g.field_2) FROM Bserv g) 
); 

Здесь, вы получаете эту таблицу в подзапросе:

sum1 sum2 sum3 
    x  0  0 
    0  y  z 

И суммированием сумм в главный запрос:

sum1 sum2 sum3 
    x  y  z 

Способ 3. Вы можете выполнить объединение:

SELECT SUM(c.field_init) FROM Cserv c 
UNION ALL 
SELECT SUM(g.filed_1) FROM Bserv g 
UNION ALL 
SELECT SUM(g.field_2) FROM Bserv g; 

В этом случае суммы будут находиться в отдельных строках, но на одной колонке. Вам нужно будет изменить свою логику программы, чтобы читать каждую строку отдельно и назначать их должным образом.

x 
    y 
    z 

Способ 3 может работать, только если порядок строк гарантирован.Для гарантии, вы можете сделать следующее вместо:

SELECT 1, SUM(c.field_init) FROM Cserv c 
UNION ALL 
SELECT 2, SUM(g.filed_1) FROM Bserv g 
UNION ALL 
SELECT 3, SUM(g.field_2) FROM Bserv g; 

Результирующее в:

1  x 
    2  y 
    3  z 

Вы можете быть уверены, чем при первом столбце 2, второй столбец несет сумму g.filed_1, и так на.

Смежные вопросы