如何从一个表中删除没有指向其他表的任何成员的所有项目?

时间:2014-01-12 07:29:34

标签: ios sqlite fmdb

表的创建方式如下:(在python中)

cursor.execute("CREATE TABLE Story (dbId INTEGER PRIMARY KEY, title TEXT, quickCode TEXT, gradeLevel TEXT, folder TEXT, expository INTEGER)")
cursor.execute("CREATE TABLE Question (dbId INTEGER PRIMARY KEY, storyId INTEGER, questionOrder INTEGER, body TEXT, answer TEXT, factual INTEGER)")
cursor.execute("CREATE TABLE Paragraph (dbId INTEGER PRIMARY KEY, storyId INTEGER, body TEXT, generalization INTEGER)")

我的应用程序中复制了数据库,并添加了如下所示的阅读表:

static NSString *dbIdColumn         = @"dbId";
static NSString *startTimeColumn    = @"startTime";
static NSString *sessionIdColumn    = @"sessionId";
static NSString *elapsedTimeColumn  = @"elapsedTime";
static NSString *totalWordsColumn   = @"totalWords";
static NSString *markedItemsColumn  = @"markedItems";
static NSString *readingOrderColumn = @"readingOrder";
@implementation ReadingController

+ (NSString *)creationString {
    return [NSString stringWithFormat:@"CREATE TABLE Reading (%@ %@, %@ %@, %@ %@, %@ %@, %@ %@, %@ %@, %@ %@)",
            dbIdColumn, SQL_DB_ID_TYPE,
            startTimeColumn, SQL_DATE_TYPE,
            sessionIdColumn, SQL_INTEGER_TYPE,
            elapsedTimeColumn, SQL_DOUBLE_TYPE,
            totalWordsColumn, SQL_INTEGER_TYPE,
            markedItemsColumn, SQL_INTEGER_TYPE,
            readingOrderColumn, SQL_INTEGER_TYPE
            ];
}

然后添加会话,通常将读数作为这些会话的一部分,但有时不会创建读数。

我正在尝试删除iOS设备上未使用的会话(没有读数的会话)

+ (void)removeUnusedSessions {
    [[[DatabaseController singleton]queue]inDatabase:^(FMDatabase *db) {
        NSString *sql = [NSString stringWithFormat:@"DELETE FROM Session where NOT EXISTS (SELECT NULL FROM Reading.sessionId = Session.dbId)"];
        [db executeUpdate:sql];
        if (![db hadError]) {
            NSLog(@"Removed unused Sessions");
        } else {
            NSError *error = [db lastError];
            NSLog(@"Unable to remove unused sessions: %@", [error description]);
        }
    }];
}

我收到如下错误代码:

$0 = 0x11453bf0 Error Domain=FMDatabase Code=1 "near "=": syntax error" UserInfo=0x11444fd0 {NSLocalizedDescription=near "=": syntax error}

为什么这不起作用的任何想法?有关更好方法的任何意见吗?

1 个答案:

答案 0 :(得分:1)

子查询必须是语法上有效的查询;表名和WHERE缺失:

DELETE FROM Session
WHERE NOT EXISTS (SELECT NULL
                  FROM Reading
                  WHERE Reading.sessionId = Session.dbId)

此查询可简化为:

DELETE FROM Session
WHERE dbId NOT IN (SELECT sessionId
                   FROM Reading)