2015-07-11 55 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

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