簡體   English   中英

Android Java SELECT SQLite

[英]Android java SELECT SQLite

我創建了此查詢,該查詢從2個表中獲取數據。 但是似乎g.filed_1被添加並相乘,因為例如,如果g.filed_1的總和為20,則查詢返回40。也許存在語法錯誤? 謝謝

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

您未指定如何聯接表。 因此,查詢生成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
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();
}

問題是表沒有相等的字段。 則不能應用字段的並集。 -用戶3160725

如果要在一個查詢中使用單個總和,則可以將單獨的查詢合並為一個查詢, 而無需在兩個表之間執行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

這樣就可以確定,當第一g.filed_1 2 ,第二列攜帶g.filed_1和,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM