2014-01-18 59 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總和,等等上。