使用 WHERE Exists(SELECT 1 FROM TABLE) 返回不同的行
Returning distinct rows using WHERE Exists(SELECT 1 FROM TABLE)
我的 SQLite 数据库中有两个 table,它们之间是一对多的关系:
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;
读取 table 的车牌列包含车牌。数据可能包含我们所说的"ambiguous license plates"。例如,车牌可能包含 "A[0OQ]C1234",其中实际的第二个字符可能是“0”、"O" 或 "Q"。在这种情况下,ExplodedPlates table 中有三行具有相同的 RowID,但 Plate 是 "A0C123",另一行是 "AOC1234",第三行是 "AQC123"。
我需要为每个唯一的 RowID 加入这些 table 和 return 一行,其中车牌与示例中的模式相匹配。因此,如果用户在搜索框中输入 "A[O0]1234",他们应该得到带有车牌 "A[0OQ]1234" 的一行,而不是 3,以及具有与该字符串匹配的其他 RowID 的任何行。
我使用 Entity Framework 编写了一个类似于此的查询:
SELECT DISTINCT r.*
FROM ExplodedPlates A x
JOIN Reads AS r ON r.RowId = x.RowID
WHERE x.Plate GLOB @Plate
这可行,但查询 returned 使用临时 B 树来执行 DISTINCT。我的老板希望我摆脱 DISTINCT 并使用 WHERE EXISTS(SELECT 1 FROM ExplodedPlates WHERE Plate GLOB @Plate)
,但我不知道如何让它工作。我的数据库中有一个特定案例,其中有 135 行与特定模式匹配,但我使用的查询是 returns 6557 行。显然,这是错误的。
我究竟如何使用 WHERE
子句来生成匹配读取的唯一列表?
这可能是您想要的:
select r.*
from reads r
where exists (select 1
from ExplodedPlates x
where r.RowId = x.RowID and
x.Plate GLOB @Plate
);
我的 SQLite 数据库中有两个 table,它们之间是一对多的关系:
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;
读取 table 的车牌列包含车牌。数据可能包含我们所说的"ambiguous license plates"。例如,车牌可能包含 "A[0OQ]C1234",其中实际的第二个字符可能是“0”、"O" 或 "Q"。在这种情况下,ExplodedPlates table 中有三行具有相同的 RowID,但 Plate 是 "A0C123",另一行是 "AOC1234",第三行是 "AQC123"。
我需要为每个唯一的 RowID 加入这些 table 和 return 一行,其中车牌与示例中的模式相匹配。因此,如果用户在搜索框中输入 "A[O0]1234",他们应该得到带有车牌 "A[0OQ]1234" 的一行,而不是 3,以及具有与该字符串匹配的其他 RowID 的任何行。
我使用 Entity Framework 编写了一个类似于此的查询:
SELECT DISTINCT r.*
FROM ExplodedPlates A x
JOIN Reads AS r ON r.RowId = x.RowID
WHERE x.Plate GLOB @Plate
这可行,但查询 returned 使用临时 B 树来执行 DISTINCT。我的老板希望我摆脱 DISTINCT 并使用 WHERE EXISTS(SELECT 1 FROM ExplodedPlates WHERE Plate GLOB @Plate)
,但我不知道如何让它工作。我的数据库中有一个特定案例,其中有 135 行与特定模式匹配,但我使用的查询是 returns 6557 行。显然,这是错误的。
我究竟如何使用 WHERE
子句来生成匹配读取的唯一列表?
这可能是您想要的:
select r.*
from reads r
where exists (select 1
from ExplodedPlates x
where r.RowId = x.RowID and
x.Plate GLOB @Plate
);