2014-01-18 94 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

您没有指定如何连接表。查询因此生成CservBserv中记录的所有可能组合。你得到两倍的总和表明另一个表只包含两条​​记录。

通常,每个表中应该有一列应该在JOIN结果中具有相同的值。假设这些列称为xy,以这种方式指定它:

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

你有什么想法吗?我无法进入JOIN。没有一个平等的领域。 – 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总和,等等上。