2015-07-11 51 views
1

下面這個查詢在Android的SQLite是返回同一列的倍數。例如,它返回「meet_id」(3)次。第一個(2)「meet_id」用正確的數字是正確的,而第三個是空的。我的「athlete_id」和「event_id」也是如此。我假定這是因爲我的左手的加入,因爲第三個表是空的,截至目前,但不應該只是如果返回一個列每列屬性(1次相遇列多行?):的Android SQLite的查詢返回多個相同的列

Cursor cursorTemp = db.rawQuery("SELECT * FROM " + TABLE_MEETS + " LEFT JOIN " + TABLE_MEETS_ATHLETES + 
       " ON " + TABLE_MEETS + "." + COL_MEET_ID + " = " + TABLE_MEETS_ATHLETES + "." + COL_MEET_ID + 
       " LEFT JOIN " + TABLE_MEETS_ATHLETES_SPLITS + " ON " + TABLE_MEETS_ATHLETES + "." + COL_MEET_ID + 
       " = " + TABLE_MEETS_ATHLETES_SPLITS + "." + COL_MEET_ID + " AND " + TABLE_MEETS_ATHLETES + 
       "." + COL_ATHLETE_ID + " = " + TABLE_MEETS_ATHLETES_SPLITS + "." + COL_ATHLETE_ID + " AND " + 
       TABLE_MEETS_ATHLETES + "." + COL_EVENT_ID + " = " + TABLE_MEETS_ATHLETES_SPLITS + "." + 
       COL_EVENT_ID + " WHERE " + TABLE_MEETS + "." + COL_MEET_ID + " = ?", new String[]{String.valueOf(i)}); 

我理解這有點混亂,但我喜歡多個原始查詢

而且,滿足ID是在所述第一表和一個主鍵和複合在第二第三

回答

3

在指令SELECT * FROM...,所述*符號包括所有列成果。由於多個連接的結果,一些列被重複。我的建議是用您感興趣的列名替換*

+0

這是愚蠢的,這不會發生在其他DBA的。我不明白爲什麼sqlite會這樣做,並重複列 –

+0

@BobTheBuilder那不是。你應該**總是**只需要你需要的列。 **要求全部都是愚蠢的('*')。 –

+0

@BobTheBuilder *所有*數據庫都以這種方式工作。自動刪除這些列的唯一方法是使用USING子句進行連接。 –

0

看來羅伯託是正確的。我在DB2中嘲笑了這一點,只要我能理解你正在嘗試的東西

create table TABLE_MEETS (COL_MEET_ID int); 

insert into table_meets (COL_MEET_ID) values (1),(2),(3); 

create table TABLE_MEETS_ATHLETES (
COL_MEET_ID int, 
COL_ATHLETE_ID int, 
COL_EVENT_ID int); 

insert into TABLE_MEETS_ATHLETES (COL_MEET_ID,COL_ATHLETE_ID,COL_EVENT_ID) values 
(1,10,100), 
(2,10,101), 
(1,20,100), 
(2,20,101); 

create table TABLE_MEETS_ATHLETES_SPLITS (
COL_MEET_ID int, 
COL_ATHLETE_ID int, 
COL_EVENT_ID int); 

insert into TABLE_MEETS_ATHLETES_SPLITS (COL_MEET_ID,COL_ATHLETE_ID,COL_EVENT_ID) values 
(1,10,100), 
(2,10,101), 
(1,20,100), 
(2,20,101); 

SELECT *將列出所有表中的列。

運行鍼對DB2:

SELECT * FROM TABLE_MEETS LEFT JOIN TABLE_MEETS_ATHLETES ON TABLE_MEETS.COL_MEET_ID=TABLE_MEETS_ATHLETES.COL_MEET_ID LEFT JOIN TABLE_MEETS_ATHLETES_SPLITS ON TABLE_MEETS_ATHLETES.COL_MEET_ID=TABLE_MEETS_ATHLETES_SPLITS.COL_MEET_ID AND TABLE_MEETS_ATHLETES.COL_ATHLETE_ID=TABLE_MEETS_ATHLETES_SPLITS.COL_ATHLETE_ID AND TABLE_MEETS_ATHLETES.COL_EVENT_ID=TABLE_MEETS_ATHLETES_SPLITS.COL_EVENT_ID WHERE TABLE_MEETS.COL_MEET_ID=1 

COL_MEET_ID COL_MEET_ID COL_ATHLETE_ID COL_EVENT_ID COL_MEET_ID COL_ATHLETE_ID選擇COL_EVENT_ID

 1   1    10   100   1    10   100 
     1   1    20   100   1    20   100 

2結果。

但你probabaly只想從一個表上報給定列。如果你真的期望NULLS,你需要考慮使用哪一個。

SELECT MEETS.COL_MEET_ID,ATHLETES.COL_ATHLETE_ID,ATHLETES.COL_EVENT_ID 
FROM TABLE_MEETS MEETS LEFT JOIN TABLE_MEETS_ATHLETES ATHLETES 
ON MEETS.COL_MEET_ID=ATHLETES.COL_MEET_ID 
LEFT JOIN TABLE_MEETS_ATHLETES_SPLITS SPLITS 
ON ATHLETES.COL_MEET_ID=SPLITS.COL_MEET_ID AND 
ATHLETES.COL_ATHLETE_ID=SPLITS.COL_ATHLETE_ID AND 
ATHLETES.COL_EVENT_ID=SPLITS.COL_EVENT_ID WHERE MEETS.COL_MEET_ID=1 

COL_MEET_ID COL_ATHLETE_ID COL_EVENT_ID

 1    10   100 
     1    20   100 

2選擇結果。

+0

好的,謝謝你的解釋 –

+0

請投票了我的答案如果它是有用的 –