使用WHERE存在返回不同的行(SELECT 1 FROM TABLE)

时间:2015-04-24 02:19:18

标签: sql sqlite distinct

我的SQLite数据库中有两个表,它们之间有一对多关系:

CREATE TABLE Reads (
    RowID     INTEGER NOT NULL PRIMARY KEY,
    EventDate INTEGER NOT NULL,
    Plate     TEXT,
    State     TEXT
);

CREATE TABLE ExplodedPlates (
    Plate     TEXT,
    RowID     INTEGER NOT NULL,
    PRIMARY KEY (RowID, Plate)
) WITHOUT RowId;

Reads表的Plate列包含车牌。数据可能包含我们称之为“模糊牌照”的内容。例如,板可以包含“A [0Q] C1234”,其中实际的第二字符可以是“0”,“O”或“Q”。在这种情况下,ExplodedPlates表中有三行具有相同的RowID但是Plate是“A0C123”,另一行是“AOC1234”,第三行是“AQC123”。

我需要连接这些表并为每个唯一的RowID返回一行,其中该板匹配与示例中的模式类似的模式。因此,如果用户在搜索框中输入“A [O0] 1234”,则它们应该获得一行,其中“A [0OQ] 1234”,但不是3,以及具有与该字符串匹配的其他RowID的任何行。

我使用类似于此的实体框架编写了一个查询:

SELECT DISTINCT r.*
FROM ExplodedPlates A x
JOIN Reads AS r ON r.RowId = x.RowID
WHERE x.Plate GLOB @Plate

这样可行,但返回的查询使用临时B树来执行DISTINCT。我的老板要我摆脱DISTINCT并使用WHERE EXISTS(SELECT 1 FROM ExplodedPlates WHERE Plate GLOB @Plate),但我不知道如何让它工作。我在我的数据库中有一个特定的案例,其中135行与特定模式匹配,但我正在使用的查询返回6557行。显然,这是错误的。

我究竟如何使用WHERE子句生成匹配读取的唯一列表?

1 个答案:

答案 0 :(得分:1)

这可能是你想要的:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"This app can’t access your current location.\n\nTo view nearby posts or create a post at your current location, turn on access for this app to your location in the Settings app under Location Services.", nil) message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"Ok", nil), nil];